【问题标题】:Check whether json attribute is a list or an object in javajava中判断json属性是列表还是对象
【发布时间】:2021-11-27 23:59:59
【问题描述】:

我想将从服务返回的 JSON 转换为 java 对象类。但是,我在同一个 JSON 属性中得到了两种类型,并因此得到以下错误 Expected begin array but it was begin object。如何在为我的 java 类解析 JSON 之前进行测试?下面的 JSON 示例:

{
  "name": "ROMEU",
  "age": "24",
  "phone": "xx xxxx xxxx",
  "family": [
    {
      "kinship": "brother",
      "age": "20"
    },
    {
      "kinship": "sister",
      "age": "25"
    }
  ]
}
{
  "name": "ROMEU",
  "age": "24",
  "phone": "xx xxxx xxxx",
  "family": {
    "kinship": "mother",
    "age": "20"
  }
} 

【问题讨论】:

标签: java arrays json jsonparser


【解决方案1】:

假设你使用的是 Jackson,你可以使用ACCEPT_SINGLE_VALUE_AS_ARRAY

final ObjectMapper mapper = new ObjectMapper()
    .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

如果使用 GSON,类似

JSONObject response=new JSONObject(res);
if(res.get("family") instanceOf JSONObject) {
    // code for JSONObject
} else if(res.get("family") instanceOf JSONArray) {
    // code for JSONOArray
}

【讨论】:

    【解决方案2】:

    解决此问题的正确方法是更改​​返回此类 JSON 的服务。返回List 或属性family 的单个对象是没有意义的。这使应该简单的事情变得复杂化。 为什么不总是返回一个List,它可能恰好包含一个对象?

    如果这是不可能的,那么您将需要各种 Jackson 反序列化功能来完成这项工作。为什么?仅仅是因为您使用的服务设计不当。

    【讨论】:

    • 我同意,但我不能更改服务。我已经解释并要求更改,但没有任何反应
    • 我担心这一点。在这种情况下,@dave 的回答应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多