创建不带引号的 JSON
Creating JSON without quotes
一个图书馆正在使用 Map 来使用一些额外的信息。该地图最终被转换为 JSON object,我需要设置请求信息以显示以用于调试目的,如下所示:
map.put("request", requestString);
我正在考虑专门使用 Jackson 创建一个不带引号的 JSON,并希望设置为 requestString
。
我正在构建关于 Request
的必要信息并构建一个包含请求 headers、参数、方法等的地图
Jackson 正在使用引号创建完全有效的 JSON,但是当我在地图中设置这个生成的值时,由于转义了引号,它显示得很丑。
所以杰克逊正在创造这个:
{
method : "POST",
path : "/register"
}
当我在地图中设置这个时,它变成了这个:
{
method : \"POST\",
path : \"/register\"
}
将此视为一张巨大的地图,包括所有参数和有关请求的其他信息。
我想要的是这个:
{
method : POST,
path : /register
}
我知道这不是有效的 JSON 但我将其用作接受字符串值的映射的字符串。
以下测试通过 (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 似乎不可行
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);
这是生成不带引号的字符串。
一个图书馆正在使用 Map 来使用一些额外的信息。该地图最终被转换为 JSON object,我需要设置请求信息以显示以用于调试目的,如下所示:
map.put("request", requestString);
我正在考虑专门使用 Jackson 创建一个不带引号的 JSON,并希望设置为 requestString
。
我正在构建关于 Request
的必要信息并构建一个包含请求 headers、参数、方法等的地图
Jackson 正在使用引号创建完全有效的 JSON,但是当我在地图中设置这个生成的值时,由于转义了引号,它显示得很丑。
所以杰克逊正在创造这个:
{
method : "POST",
path : "/register"
}
当我在地图中设置这个时,它变成了这个:
{
method : \"POST\",
path : \"/register\"
}
将此视为一张巨大的地图,包括所有参数和有关请求的其他信息。
我想要的是这个:
{
method : POST,
path : /register
}
我知道这不是有效的 JSON 但我将其用作接受字符串值的映射的字符串。
以下测试通过 (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 似乎不可行
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);
这是生成不带引号的字符串。