jackson 创建不带引号的JSON

yhqotfr8  于 2022-12-18  发布在  其他
关注(0)|答案(2)|浏览(147)

一个库正在使用Map来使用一些额外的信息。这个Map最终将被转换为JSON对象,我需要设置请求信息以显示调试目的,如下所示:
map.put("request", requestString);
我正在考虑专门使用Jackson来创建一个没有引号的JSON,并希望设置为requestString
我正在构建关于Request的必要信息,并构建一个Map,包括请求头、参数、方法等。
Jackson创建了带引号的完全有效的JSON,但是当我在map中设置这个生成的值时,它显示得很难看,因为有转义引号。
所以Jackson创造了这个:

{
   method : "POST",
   path : "/register"
}

当我在map中设置这个时,它变成了这样:

{
   method : \"POST\",
   path : \"/register\"
}

可以将其看作一个包含所有参数和其他请求信息的巨大Map。
我想要的是:

{
   method : POST,
   path : /register
}


我知道这不是一个有效的JSON,但我将其作为一个字符串用于接受字符串值的Map。

cwdobuhd

cwdobuhd1#

public class UnQuotesSerializer extends NonTypedScalarSerializerBase<String>
{
   public UnQuotesSerializer() { super(String.class); }

   /**
    * For Strings, both null and Empty String qualify for emptiness.
    */
   @Override
   public boolean isEmpty(String value) {
      return (value == null) || (value.length() == 0);
   }

   @Override
   public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
      jgen.writeRawValue(value);
   }

   @Override
   public JsonNode getSchema(SerializerProvider provider, Type typeHint) {
      return createSchemaNode("string", true);
   }

   @Override
   public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException {
      if (visitor != null) visitor.expectStringFormat(typeHint);
   }
}

以及

ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule("UnQuote");
module.addSerializer(new UnQuotesSerializer());

objectMapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
objectMapper.registerModule(module);

这是生成不带引号的字符串。

ohtdti5x

ohtdti5x2#

以下测试通过(Jackson 2.5.0

@Test
public void test() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    Map map = new HashMap();
    map.put("method", "POST");
    map.put("request", "/register");
    String s = mapper.writeValueAsString(map);
    Map map2 = mapper.readValue(s, Map.class);
    Assert.assertEquals(map, map2);
}

所以不带引号的伪JSON似乎不太合适

相关问题