【问题标题】:JSON Parsing Array and Single Object with same nameJSON解析数组和同名的单个对象
【发布时间】:2019-03-11 14:42:51
【问题描述】:

我需要解析从外部来源传入的 JSON 数据。问题是有时数据数组被发送进来,有时它作为单个对象进来,但是数组和单个对象具有相同的名称。

{
  "OuterObject": {
    "Names":[
      {
      "name": "John Doe"
      },
      {
      "name": "William Watson"
      }
    ]
  }
}

但是当 JSON 数组只有一个元素时,它看起来像这样:

{
"OuterObject": {
    "Names": {
    "name": "John Doe"
    }
  }
}

我的应用程序需要能够处理其中之一,但不能同时处理两者。

这就是我的 Json 解析类的样子:

@JsonRootName("OuterObject")
public class OuterObject {

    @JsonProperty("Names")
    private Names names;
    @JsonProperty("Names")
    private List<Names> namesList;

    public Names getNames() {
        return names;
    }
    public void setNames(Names names) {
        this.names = names;
    }
    public List<Names> getNamesList() {
        return namesList;
    }
    public void setNamesList(List<Names> namesList) {
        this.namesList = namesList;
    }

}

但是,对于列表和单个对象,使用相同的 json 属性名称似乎不起作用。它似乎也不只是使用数组并将单个 json 对象解析到列表中。当数组和对象具有相同的名称时,有谁知道我的应用程序可以处理 json 数组和单个 json 对象的任何方式?

【问题讨论】:

  • 您发布的两个示例都是无效的 JSON。您真正收到了什么?你也没有说你正在使用哪个 JSON 解析器。
  • 请说明您到目前为止所做的尝试。您使用的是 Jackson ObjectMapper
  • 已编辑以使 JSON 有效。
  • 是的,我正在使用 Jackson ObjectMapper,如下所示:OuterObject myOuterObject = objectMapper.readValue(jsonString, OuterObject.class)。

标签: java json


【解决方案1】:

您只需要使用List&lt;Names&gt; 类型的单个字段,并激活功能ACCEPT_SINGLE_VALUE_AS_ARRAY

YourClass result = mapper.reader(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
                         .forType(YourClass.class)
                         .readValue(json);

【讨论】:

    【解决方案2】:

    如果只有一个 JSONObject,我使用以下方法转换 JSONArray。

    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    private JSONArray getJSONArray(JSONObject json, String field) {
            JSONArray array;
            if(json.get(field) instanceof JSONObject){
                array = new JSONArray();
                array.add(json.get(field));
            }else{
                array = json.getJSONArray(field);
            }
            return array;
        }
    

    【讨论】:

      【解决方案3】:

      将您的 json 转换为 Map,然后使用您的代码获得所需的结果。

      ObjectMapper mapper = new ObjectMapper();
          Map<String, Object> map = mapper.convertValue(json, Map.class);
      

      或更好

      Map<String, Object> map = mapper.convertValue(json, new TypeReference<Map<String, Object>>() {});
      

      【讨论】:

      • 如果您认为它与该问题重复,则将其标记为这样。但事实并非如此,因为问题是关于杰克逊,而不是 Gson。
      • 谢谢。杰克逊在后来的评论中被提及。我错过了那部分。
      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2013-03-22
      • 1970-01-01
      • 2015-06-02
      相关资源
      最近更新 更多