use*_*231 10 java json jackson mapper
我有一个Json格式的字符串,只有没有键或值被引号括起来.例如,我有这个:
String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}"
Run Code Online (Sandbox Code Playgroud)
我希望这成为一个看起来像这样的地图:
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));
Run Code Online (Sandbox Code Playgroud)
我尝试了以下两种方法:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
Run Code Online (Sandbox Code Playgroud)
这将引发错误,说:
Unexpected character ('n'): was expecting double-quote to start field name
Run Code Online (Sandbox Code Playgroud)
然后我尝试更改映射器的配置:
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
Run Code Online (Sandbox Code Playgroud)
但这引发了一个错误说:
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]
Run Code Online (Sandbox Code Playgroud)
当引号不包含在json字符串中时,有没有办法获取此Map?
如果 Json 输入无效,则 ObjectMapper 将无法解析该输入,因此答案是否定的。
在这里测试你的 Json: http: //jsonlint.com/
更正 Json 输入后,您可以执行以下操作:
ObjectMapper ob = new ObjectMapper();
ob.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
String json = "{name: \"Bob\", state: \"Colorado\", Friends: [{ name: \"Dan\", age: 23 }, {name: \"Zane\", age: 24 }]}";
Map<String, ObjectNode> theMap = ob.readValue(json, Map.class);
System.out.println(theMap.get("name"));
Run Code Online (Sandbox Code Playgroud)
将打印:
鲍勃
| 归档时间: |
|
| 查看次数: |
12348 次 |
| 最近记录: |