JSON解析数组和具有相同名称的单个对象

时间:2017-07-13 21:19:46

标签: java json

我需要解析来自外部源的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对象的任何方法?

3 个答案:

答案 0 :(得分:1)

您只需使用HttpResponseMessage类型的单个字段,并激活功能ACCEPT_SINGLE_VALUE_AS_ARRAY

List<Names>

答案 1 :(得分:1)

如果它只是一个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;
    }

答案 2 :(得分:-1)

将您的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>>() {});