我有一个 Json 格式的字符串,只是没有任何键或值被引号括起来。例如,我有这个:
String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}"
我希望它成为一张看起来像这样的 map :
Map<String, Object> friend1Map = new HashMap<>();
friend1Map.put("name", "Dan");
friend1Map.put("age", 23);
Map<String, Object> friend2Map = new Hashmap<>();
friend2Map.put("name", "Zane");
friend2Map.put("age", 24);
Map<String, Object> newMap = new HashMap<>();
newMap.put("name", "Bob");
newMap.put("state", "Colorado");
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map));
我试过以下两种方法:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
这会抛出一个错误,说:
Unexpected character ('n'): was expecting double-quote to start field name
然后我尝试更改映射器的配置:
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
但这引发了一个错误:
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Bob': was expecting ('true', 'false' or 'null')
at [Source: {name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}; line: 1, column: 11]
当引号不包含在 json 字符串中时,有没有办法获取此 Map?
最佳答案
从 GSON v2.8.6 开始
带有 jackson fasterxml 的 ObjectMapper 不支持不带引号的值,但 GSON 支持:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonParser;
.
JsonNode json = json("{"
+ " name: Bob, "
+ " state: Colorado,"
+ " Friends: [ "
+ " {"
+ " name: Dan, "
+ " age: 23 "
+ " },"
+ " {"
+ " name: Zane, "
+ " age: 24 "
+ " }"
+ " ],"
+ " extra: \"text with spaces or colon(:) must be quoted\""
+ "}");
Map m = new ObjectMapper().convertValue(json, Map.class);
.
JsonNode json(String content) throws IOException {
String canonicalFormat = JsonParser.parseString(content).toString();
return json.readTree(canonicalFormat);
}
早期的 GSON
在 v2.8.6 之前,GSON 没有静态的 parseString 方法。所以你应该使用(在更高版本中不推荐使用)实例方法:
JsonNode json(String content) throws IOException {
String canonicalFormat = new JsonParser().parse(content).toString();
return json.readTree(canonicalFormat);
}
自 Java 15 起
注意:我们预计 Java 15 将按原样支持未转义的双引号:
var json = """
{"name": "Bob", "state": "Colorado", "Friends": [{ "name": "Dan", "age": 23 }, {"name": "Zane", "age": 24 }]} """;
关于java - 将不带引号的json字符串转换为 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36582892/