简体   繁体   English

无法将 Json 字符串转换为 Map<String, Object>

[英]Unable to convert Json string to Map<String, Object>

I am trying to convert my json into a map uisng jackson-core-2.9.6 .我正在尝试将我的 json 转换为地图 uisng jackson-core-2.9.6 。 My json is我的 json 是

 {
  "name": "Loren",
  "inputDetails": {
  "truncated": false,
   "result": [
     {
    "subjects": [
      {
        "math": "50",
        "SST": "37 ",
        "status": "ACTIVE"
      }
    ]
  }
]
},
"timeoutInSeconds": null
}

and the Java Code is by which I am trying to parse this JSON into Map is like this我试图将这个 JSON 解析成 Map 的 Java 代码是这样的

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();
    }
    
  }

Exception which I am getting is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of java.util.LinkedHashMap (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{ "name": "Loren", "inputDetails": { "truncated": false, "result": [ { "subjects": [ { "math": "50", "SST": "37 ", "status": "ACTIVE" } ] } ] }, "timeoutInSeconds": null }') at [Source: (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}"";我得到的异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造java.util.LinkedHashMap实例(尽管至少存在一个 Creator):没有字符串参数构造函数/工厂方法从字符串值反序列化( '{ "name": "Loren", "inputDetails": { "truncated": false, "result": [ { "subjects": [ { "math": "50", "SST": "37 ", " status": "ACTIVE" } ] } ] }, "timeoutInSeconds": null }') at [Source: (String)""{\\r\\n "name": "Loren",\\r\\n "inputDetails": {\\r\\n "截断": 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}""; line: 1, column: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342) at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1031) at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371) at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323) at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:357) at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004) at Test.main(Test.java:22) line: 1, column: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342) at com .fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1031) 在 com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371) 在 com.fasterbind.stjackdesson. .StdValueInstantiator.createFromString(StdValueInstantiator.java:323) at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:357) at com.fasterxml.jackson.databind.deser.std.deserializeserializer (MapDeserializer.java:29) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004) at Test.main(测试.java:22)

I have tried looking into similar questions available on Stakoverflow but unable to find json with similar structure which is having both string and objects.我曾尝试研究 Stakoverflow 上可用的类似问题,但无法找到具有类似结构的 json,其中包含字符串和对象。

The above code worked for me for parsing.上面的代码对我有用,用于解析。 But since you need result variable, it is inside inputDetails .但是由于您需要 result 变量,它在inputDetails So you need to change last line as below:所以你需要改变最后一行如下:

List servicesResponse = (List) ((Map<String, Object>)inputParam.get("inputDetails")).get("result");

This is what causing your problem这就是导致您问题的原因

request = objectMapper.writeValueAsString(request);

It affects your String json, just pass the String object to the readValue method, it accepts also strings它会影响您的 String json,只需将 String 对象传递给readValue方法,它也接受字符串

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM