当前位置: 首页 > 知识库问答 >
问题:

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

陆弘光
2023-03-14

我正试图用jackson-core-2.9.6把我的json转换成地图。我的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(尽管至少存在一个Creator):没有String参数构造函数/工厂方法可以从[源:(String)“”{\r\n“name”:“Loren”,“inputDetails”:[{“subjects”:[{“math”:“50”,“SST”:“37”,“status”:“ACTIVE”}]},“timeoutInSeconds”:null}')处的String值反序列化\r\n“截断”:false,\r\n“result”:[\r\n{\r\n“subjects”:[\r\n\r\n{\r\n”math“:“50”,\r\n”SST“:“37”,\r\n“status”:“ACTIVE”\r\n}\r\n]\r\n},\r\n”timeoutInSeconds“:null\r\n}”;行:1,com.fasterxml.jackson.databind.exc.MimatchedInputException的列:1],来自com.fastrxml.jackson.databind.数据绑定.DeserializationContext.reportInputMimatch(DeserialiizationContext.java:1342)的(MismatchedInput异常.java:63)com.fasterxml.jackson.databind.deser.ValueInstantiator.createFromStringFallbacks(ValueInstantator.java:371),位于com.fastrxml.jackson.databind.deser.std.StdValueInstantianator.createFremString(StdValueInstantantiator.java=323),位于com(MapDeserializer.java:29),位于com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013),位于Test.main(Test.java:22)

我尝试过研究 Stakoverflow 上可用的类似问题,但找不到具有类似结构的 json,它同时具有字符串和对象。

共有2个答案

淳于健
2023-03-14

上面的代码对我有用,用于解析。但是由于您需要结果变量,因此它在inputDetails中。因此,您需要更改最后一行,如下所示:

List servicesResponse = (List) ((Map<String, Object>)inputParam.get("inputDetails")).get("result");
鲜于峰
2023-03-14

这就是导致你问题的原因

request = objectMapper.writeValueAsString(request);

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

 类似资料:
  • 问题内容: 我有一个无效的json字符串,如下所示, 我尝试使用JSON.parse将其转换为对象。但是,这不是有效的json字符串。是否有任何函数可以将这种无效格式转换为有效的json字符串或直接转换为对象? 问题答案: 如果您的示例语法与真实JSON相同,则JSONLint表示您需要对名称和值使用双引号。 仅在这种情况下,请使用以下替换调用: 但是,您首先应该尝试使用有效的Json。

  • 我有一个RestController类,它有一个方法可以根据电影的标题搜索电影: 如果我发送一个json字符串 从邮递员到endpoint,我收到一个空白的回复。 然后我做了一个 就在进入方法后找到字符串filmSearch正是我从邮递员发送的JSON字符串。我的应用程序没有看到JSON和提取值从filmSearch在我的请求附加到应用程序内字符串filmSearch. 如果我移除 在请求映射的一

  • 我无法将给定的Json字符串转换为java对象

  • 问题内容: 从来源来看,我无法影响我在地图中获得的数据,该地图以表示。 我需要处理所包含的数据,最好是(其中的数据非常适合该处理)。 我还需要从数据中生成键列表,因为这些键是事先未知的。 我可以在网上找到的大多数类似问题或多或少都说这是不可能的,但是如果我的地图是,则表明数据在那里,可读性为。 我该怎么办fmt.Println可以做什么? 问题答案: 处理未知接口的一种安全方法,只需使用fmt.S

  • 问题内容: 我有两个字符串数组键和值 将它们转换为地图的最快方法是什么?我知道我们可以遍历它们。但是,这里有实用程序吗? 问题答案: 比这快吗?

  • 问题内容: 您如何将此String转换为gson.JsonArray? 这是我的代码: 这是将这个Collections字符串转换为JSonArray的方法吗? 问题答案: 要在JSON数组中包含字符串值,必须记住在Java程序中用反斜杠转义双引号。请参见下面的声明。 您在main()方法中的代码可以正常工作。以下只是对main()方法中的代码的微小修改。 最后,请记住在语句“ com.googl