【问题标题】:Unexpected character ('=' (code 61)): while parsing JsonString意外字符('='(代码 61)):解析 JsonString 时
【发布时间】:2018-07-17 17:55:23
【问题描述】:

在解析 JSONString (assigned=[util.TaskAudit@24c7b944]}) 时如下:

Map<String, List<TaskAudit>> auditTrailMap = new HashMap<>();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

try {
    auditTrailMap = mapper.readValue(strObject, new TypeReference<Map<String, List<TaskAudit>>>(){});
} catch (IOException e) {
    log.error("{}", e);
}

我收到以下异常:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('=' (code 61)): 期望用冒号分隔字段名称和值 [junit] 在 [来源:{assigned=[util.TaskAudit@24c7b944]};行:1,列:11]

任何人都可以提供有关如何解决此问题的任何线索。

编辑:基本上这个函数的输入是一个来自数据库的字符串字段。在保存时,我们像这样保存它:

        Map<String, List<TaskAudit>> auditTrailMap = new HashMap<>();
        auditTrailMap.put("assigned", taskAuditList);
        String jsonString =  new JSONObject(auditTrailMap).toString();

但是在尝试解析 jsonString 时,它就像 (assigned=[util.TaskAudit@24c7b944]}),我不知道 '=' 来自哪里以及如何解析它。

【问题讨论】:

  • (assigned=[util.TaskAudit@24c7b944]}) 不是有效的 JSON 字符串
  • 嗨@lucasvw 这个字符串是从另一个API 到地图上的toString() 时生成的。生成的字符串就是上述函数的输入。
  • 如何解决?修复 JSON
  • = 没有在 JSON 中使用,它描述的是 数据,而不是函数。我建议你做一些关于 JSON 的基本阅读。它一般表示数组和对象,其中对象使用"key" : "value" 对。 Here's an example 来自 json.org
  • JSONObject 类是什么?几乎可以肯定的是,它的 toString() 方法并没有按照你的想法做。

标签: java java-8 jackson jsonparser


【解决方案1】:

您的方法的问题是“您试图以错误的方式将 MAP 解析为 JSON。”

您需要在那里使用 ObjectMapper 将您的 MAP 解析为 JSON 字符串。完成此操作后,您应该能够根据 Map 中存在的 KEY 和 VALUE 获得预期的正确 JSON 字符串。

   Map<String, List<TaskAudit>> auditTrailMap = new HashMap<>();
   auditTrailMap.put("assigned", taskAuditList);
   String jsonString =  new ObjectMapper().writeValueAsString(auditTrailMap); 

执行此操作后,您将获得正确的 JSON: { "assigned" : "您在地图中设置的键的对应值" }

希望这有助于您的预期要求。

【讨论】:

    【解决方案2】:

    任何人都可以提供有关如何解决此问题的任何线索。

    你已经拥有了

    {assigned=[util.TaskAudit@24c7b944]}
    

    不是有效的 JSON 字符串。

    toString() Map 的方法不需要返回 JSON 表示,所以你必须自己将它序列化为 JSON,like in this answer

    Map<String,String> payload = new HashMap<>();
    payload.put("key1","value1");
    payload.put("key2","value2");
    
    // right way to convert map to JSON:
    String json = new ObjectMapper().writeValueAsString(payload); 
    

    根据您的需要调整上面的代码,可能会重用ObjectMapper 实例。

    并在适应新技术之前先阅读the docsexamples,这将为您将来节省大量时间,因为它们通常会突出人们使用库的最常见案例。

    【讨论】:

      【解决方案3】:
      ObjectMapper om=new ObjectMapper();
          om.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
      
          List<RootMember> outputList;
          try {
              ObjectMapper mapper = new ObjectMapper();
              String json = mapper.writeValueAsString(resp); 
              outputList = om.readValue(json, new TypeReference<List<RootMember>>(){});
          } catch (JsonMappingException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (JsonProcessingException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      

      【讨论】:

        猜你喜欢
        • 2013-05-31
        • 2018-08-18
        • 2014-06-09
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多