【问题标题】:How Parse JSON using GSON WHen object is either JSONObject or JSONArray当对象是 JSONObject 或 JSONArray 时如何使用 GSON 解析 JSON
【发布时间】:2014-07-21 23:34:09
【问题描述】:

我正在使用 Gson 将 JSON 转换为 Java 对象。我在 json 中有一个字段,我们明智的服务人员根据数据库中返回的项目数将其编码为数组或对象。问题是如何对 Java 对象进行建模以传递给 Gson 转换器以便我可以处理这两种类型?

json = new Gson().fromJson(reader, Order.class);

Java 类只正确解析 JSON 数组

public class Order {
    private Detail detail
}

public class Detail {
    public String id;
    public List<Type> types;
    //// getters and setters
}

public class Type {
    public String typeId;
    public String typeName
    //// getters and setters
}

JSON 数据数组

{
    "detail":{
        "id":"1234565",
        "types":{
            "type":[
                {"typeId":"1246565","typeName":"MyName1"},
                {"typeId":"1444445","typeName":"MyName2"}
            ]
        }
    }
}

JSON 数据对象

{
    "detail":{
        "id":"1234565",
        "types":{
            "type":{"typeId":"1246565","typeName":"MyName1"}
        }
    }
}

【问题讨论】:

  • 在 GSON 中没有办法询问元素的类型是什么吗?
  • 正如您所提到的,您正在使用糟糕的服务设计。即使数据库中只有一个项目,您能否与数据服务人员讨论仅使用第一种类型(JSON 数据数组)?这不仅会让您更容易,而且将来使用该服务的其他开发人员/团队也会更容易。
  • 例如,isJsonArrayisJsonObject。 (我在 30 秒内找到了这些,我什至不使用 GSON。)
  • 我别无选择,服务已设置,并且由于遗留问题而不得不保持这种状态......我只是试图不再手动解析对象并使用 Gson 自动解析。
  • 您的确切问题是什么?是否要将JSON字符串都转换为java对象并且事先不知道。

标签: java json gson


【解决方案1】:

我想出了如何使用通用对象来做到这一点。所以现在我仍然可以使用 GSON 调用,而不必只在我需要重构对象时进行那么多手动解析,并且只需要那个特定的对象。

json = new Gson().fromJson(reader, Order.class);

主要对象

public class Order {
    private Detail detail
}

细节类

public class Detail {
    public String id;
    public Types types;

    //// getters and setters
    public Types getTypes() {
        return types;
    }

    public void setTypes(Types types) {
        this.types = types;
    }
}

Types 类包含一个名为 type 的通用 Object,因此它可以存储 List 或一个 LinkedTreeMap,它是 JSONObject 被解析的方式。然后您必须手动将其插入到新的 Type 对象中。

public class Types {
    private Object type;

    //// getters and setters

    public Object getType() {
        return type;
    }

    public void setType(Object type) {
        this.type = type;
    }

    public List<Type> getListType() {
        if (type instanceof List) {
            return (List<Type>) type;
        } else
            return null;
    }

    public Type getObjectType() {
        if (type instanceof Type) {
            return (Type) type;
        } else if (type instanceof Map) {
            Map<String, String> map = (Map<String, String>)type;
            Type newType = new Type((String)map.get("typeId"), (String)map.get("typeName"));
            return newType;
        }
        return null;
    }

public class Type {
    private String typeId;
    private String typeName;

    public Type() {}

    public Type(String id, String name) {
        this.typeId = id;
        this.typeName = name;
    }

    //// getters and setters
    public String getTypeId() {
        return typeId;
    }

    public void setTypeId(String typeId) {
        this.typeId = typeId;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
}

【讨论】:

    【解决方案2】:

    叹息!!

    JsonArray typeArray; 
    JsonElement typeElement = types.get("type"); 
    if (typeElement.isJsonObject()) { 
        typeArray = new JsonArray();
        typeArray.add(typeElement); 
    }
    else {
        typeArray = (JsonArray)typeElement;
    }
    for (int i = 0; i < typeArray.size(); i++) {
        JsonObject typeObject = (JsonObject)(typeArray.get(i));
        typeObject.doSomethingWithThis();
    }
    

    【讨论】:

    • 我不想拆开 JSON,因为我需要将它堆积到 Java 对象中。我拥有的 Java 类比我展示的要复杂得多,它具有多个级别的 Java 对象。因此,为什么我想通过 Gson().fromJson() 来做。我想知道在 Java Object 类中是否有某种方法可以通过注释或其他方法来实现
    • @JPM - 好吧,把它放回原处,随心所欲地处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多