如何解决无法将Json字符串转换为Map <String,Object>
我正在尝试将json转换为uisng jackson-core-2.9.6映射。我的json是
{
"name": "Loren","inputDetails": {
"truncated": false,"result": [
{
"subjects": [
{
"math": "50","SST": "37 ","status": "ACTIVE"
}
]
}
]
},"timeoutInSeconds": null
}
而我试图通过Java代码将JSON解析为Map就是这样
public static void main(String[]args){
String request="{\r\n \"name\": \"Loren\",\r\n \"inputDetails\": {\r\n \"truncated\": false,\r\n \"result\": [\r\n {\r\n \"subjects\": [\r\n {\r\n \"math\": \"50\",\r\n \"SST\": \"37 \",\r\n \"status\": \"ACTIVE\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n \"timeoutInSeconds\": null\r\n}";
try {
List servicesResponse = null;
Map<String,Object> inputParam=null;
ObjectMapper objectMapper = new ObjectMapper();
request = objectMapper.writeValueAsString(request);
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,true);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
inputParam = (Map<String,Object>) objectMapper.readValue(request,Map.class);
servicesResponse = (List)inputParam.get("result");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我得到的异常是
com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造java.util.LinkedHashMap
的实例(尽管存在至少一个Creator):没有从字符串值反序列化的String参数构造函数/工厂方法('{
“ name”:“ Loren”,
“ inputDetails”:{
“截断”:false,
“结果”:[
{
“主题”:[
{
“ math”:“ 50”,
“ SST”:“ 37”,
“状态”:“有效”
}
]
}
]
},
“ timeoutInSeconds”:null
}')
在[来源:(String)“” {{r \ n“ name”:“ Loren”,\ r \ n“ inputDetails”:{\ r \ n“ truncated”:false,\ r \ n“ result”:[ \ r \ n {\ r \ n“ subjects”:[\ r \ n {\ r \ n“ math”:“ 50”,\ r \ n“ SST”:“ 37”,\ r \ n“ status” :“ ACTIVE” \ r \ n} \ r \ n] \ r \ n} \ r \ n] \ r \ n},\ r \ n“ timeoutInSeconds”:null \ r \ n}“”;行:1,列:1]
在com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
在com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342)
在com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1031)处
在com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
在com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
在com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:357)
在com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)
在com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
在com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
在Test.main(Test.java:22)
我试图研究Stakoverflow上可用的类似问题,但是找不到具有字符串和对象的具有相似结构的json。
解决方法
上面的代码对我有用。但是由于您需要结果变量,因此它位于inputDetails
内部。因此,您需要按如下所示更改最后一行:
List servicesResponse = (List) ((Map<String,Object>)inputParam.get("inputDetails")).get("result");
,
这是导致您出现问题的原因
request = objectMapper.writeValueAsString(request);
它会影响您的String json,只需将String对象传递给readValue
方法,它也接受字符串
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。