【问题标题】:Unable to convert Json string to Map<String, Object>无法将 Json 字符串转换为 Map<String, Object>
【发布时间】:2020-12-26 12:48:10
【问题描述】:

我正在尝试将我的 json 转换为地图 uisng jackson-core-2.9.6 。我的json是

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

我试图将这个 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();
    }
    
  }

我得到的例外是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造java.util.LinkedHashMap 的实例(尽管至少存在一个创建者):没有从字符串值反序列化的字符串参数构造函数/工厂方法('{ “名称”:“洛伦”, “输入细节”:{ “截断”:错误, “结果”: [ { “主题”:[ { “数学”:“50”, “SST”:“37”, “状态”:“活动” } ] } ] }, “timeoutInSeconds”:空 }') 在 [Source: (String)""{\r\n "name": "Loren",\r\n "inputDetails": {\r\n "truncated": false,\r\n "result": [ \r\n {\r\n "主题": [\r\n {\r\n "数学": "50",\r\n "SST": "37",\r\n "状态" : "活动"\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,它同时具有字符串和对象。

【问题讨论】:

  • 请提供更多细节,这段代码非常适合我
  • @DanielTaub 我已经添加了我的完整代码-com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造java.util.LinkedHashMap 的实例(尽管至少存在一个创建者):没有字符串参数从字符串值反序列化的构造函数/工厂方法 ('{ "name": "Loren", "inputDetails": { "truncated": false, "result": [ { "subjects": [ { "math": "50" ,“SST”:“37”,“状态”:“活动”

标签: java json jackson


【解决方案1】:

这就是导致您的问题的原因

request = objectMapper.writeValueAsString(request);

它会影响您的 String json,只需将 String 对象传递给 readValue 方法,它也接受字符串

【讨论】:

    【解决方案2】:

    上面的代码对我有用。但是由于您需要结果变量,所以它在inputDetails 内。所以你需要改变最后一行如下:

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

    【讨论】:

    • 我无法仅解析它。我已经添加了我的完整代码,但我得到了例外。
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2013-05-24
    • 2014-01-29
    • 2018-02-14
    • 2015-11-21
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多