【问题标题】:Getting 400 Error while reading JSON读取 JSON 时出现 400 错误
【发布时间】:2017-04-28 11:03:02
【问题描述】:

我正在发送以下 JSON:

{
  "sqId": "10009",
  "pCode": [
    {
      "key": [
        [
          1,
          0,
          1
        ]
      ]
    }
  ],
  "hdId": "87",
  "sType": [
    {
      "key": [
        {
          "id": "id_1",
          "q": "1",
          "pCode": "pCode_1",
          "Type": "T_1",
          "Level": "f"
        }
      ]
    }
  ]
}

与下面的 POJO 映射:

public class Pinfo {

   protected String sqId;
   protected String hdId;
   protected Map<String, Integer> pCode;
   protected Map<String, List<sType>> sType;

   public Map<String, List<sType>> getsType() {
      return sType;
   }

   public void setsType(Map<String, List<sType>> sType) {
      this.sType = sType;
   }

   public String getsqId() {
      return sqId;
   }

   public void setsqId(String sqId) {
      this.sqId = sqId;
   }

   public Map<String, Integer> getpCode() {
      return pCode;
   }

   public void setpCode(Map<String, Integer> pCode) {
      this.pCode = pCode;
   }

   public String gethdId() {
      return hdId;
   }

   public void sethdId(String hdId) {
      this.hdId = hdId;
   }

}

现在使用以下代码读取 JSON:

Map<String, Integer> pMap = (Map<String, Integer>) PinfoObj.getpCode(); //Getting Error 
logger.debug("### pMap ###"+pMap.values());

但我遇到了错误:

“无法读取文档:无法反序列化 java.util.LinkedHashMap out of START_ARRAY token\n at [Source: java.io.PushbackInputStream@5ed7c090;行:2,列:40](通过 参考链:com.ve.pg.dto.Pinfo[\"pCode\"]);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:不能 从 START_ARRAY 中反序列化 java.util.LinkedHashMap 的实例 令牌\n 在 [来源:java.io.PushbackInputStream@5ed7c090;线:2, 列:40](通过参考链: com.vonage.pg.dto.Pinfo[\"pCode\"])"

目前无法弄清楚我缺少什么,任何想法或提示都会很棒。

【问题讨论】:

  • 你从哪里得到 400 错误?
  • pCode 在我看来不像Map&lt;String, Integer&gt;,更像是Map&lt;String, Map&lt;String, Integer[][]&gt;[]&gt;
  • 在 Invalid Input(JSON) 的情况下手动抛出 400。

标签: java json jackson


【解决方案1】:

类型不匹配,可以这样改:

   protected List<Map<String, List<List<Integer>>>> pCode;
   protected List<Map<String, List<Map<String, String>>>> sType;

【讨论】:

    【解决方案2】:

    错误:

    Could not read document: Can not deserialize instance of
           java.util.LinkedHashMap out of START_ARRAY token
    

    告诉你“我遇到了一个 START_ARRAY 令牌 ([),但你要求我反序列化为地图,所以我期待找到一个 START_OBJECT 令牌 ({)”

    你的错误是试图反序列化类似的东西

    [{
      "key": [
        [
          1,
          0,
          1
        ]
      ]
    }]
    

    Map&lt;String, Integer&gt;,而实际上是List&lt;Map&lt;String, List&lt;List&lt;Integer&gt;&gt;&gt;&gt;。您应该更改 JSON 的结构,或更改要反序列化的类型。

    应该为sType修复同样的错误。

    【讨论】:

    • 所以如果我必须接受 只需要在 JSON 中更改什么?
    • {"sqId":null,"hdId":null,"pCode":{"key2":2,"key1":1},"sType":{}}
    • @Affy 如果你想接受一个 integer,JSON 应该看起来像{"key": 1, "value": 2, "xxx": 3}。在您的情况下,您似乎想要接受多个整数 (Map&lt;String, List&lt;Integer&gt;&gt; pCode),相应的 JSON 应该类似于 {"key": [1, 2, 3], "value": [4, 5, 6]}
    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2016-10-19
    • 1970-01-01
    相关资源
    最近更新 更多