【问题标题】:Check JSON object in java在java中检查JSON对象
【发布时间】:2017-08-11 07:53:11
【问题描述】:

我正在使用改造 2 获取 JSON,如果键具有值,则它携带对象,否则为空数组。例如:

如果键,即 address 有值,则返回对象

{
    "student": {
        "name": "Some name",
        "address": {
            "house": "5",
            "road": "3"
        }
    }
}

如果键即 address 没有任何值,则返回空数组

{
    "student": {
        "name": "Some name",
        "address": []
    }
}

在我的 POJO 类中,我将 Address 类类型设置为对象,以便改造可以解析 JSON。

public class Student {

@SerializedName("name")
@Expose
private String name;
@SerializedName("address")
@Expose
private Object address;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Object getAddress() {
return address;
}

public void setAddress(Object address) {
this.address = address;
}

}

现在如何检查 address 类型是对象还是数组?

我尝试过使用 isArray(),但没有找到结果。

if(obj.getclass().isArray())

提前致谢。

【问题讨论】:

标签: java android json retrofit2 jsonschema2pojo


【解决方案1】:

您可以通过instanceof查看对象是JosnObject还是JsonArray?

if (address instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) address;
}
else  if (address instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) address;
}

【讨论】:

    【解决方案2】:

    您可以进行 json 模式验证,您必须定义所有重新分级 json 的类型和格式的内容,然后使用验证您的 json Jackson 2.x 库和 fge/json-schema-validator。

    更多详情请参考链接。

    http://wilddiary.com/validate-json-against-schema-in-java/

    【讨论】:

      【解决方案3】:

      我想知道为什么您的 json 不一致? 我的意思是,如果地址中没有值,它不应该是 JSONArray

      相反,它应该像 -

      "address": {
          "house": "",
          "road": ""
      }
      

      如果你像上面那样做,它会很容易解析 - 现在你Pojo 将是 -

      public class Address {
      
      @SerializedName("house")
      @Expose
      private String house;
      @SerializedName("road")
      @Expose
      private String road;
      
      public String getHouse() {
      return house;
      }
      
      public void setHouse(String house) {
      this.house = house;
      }
      
      public String getRoad() {
      return road;
      }
      
      public void setRoad(String road) {
      this.road = road;
      }
      
      }
      

      最后你可以得到Address 使用 -

      @SerializedName("address")
      @Expose
      private Address address;
      

      在你的 Student 班级中

      PS,
      服务器端问题必须由服务器端解决。

      【讨论】:

        【解决方案4】:

        谢谢大家。我在 instanceof 的帮助下找到了答案。 而不是直接检查 address obj,我必须将值转换为 Object 类型,即

        Gson gson = new GsonBuilder().serializeNulls().setLenient().create();
        String jsonStr = gson.toJson(obj.getAddress());
        Object json = new JSONTokener(jsonStr).nextValue();
        

        然后我可以检查 JSONObject

        if (json instanceof JSONObject) {
         // Object
        }else{
         // Array
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 2014-01-15
          • 1970-01-01
          相关资源
          最近更新 更多