【问题标题】:Android : Different type of Json content parsing using GsonAndroid:使用 Gson 解析不同类型的 Json 内容
【发布时间】:2017-11-05 17:59:14
【问题描述】:

我开始使用 Gson 解析 json 数据。

杰森内容会像

{ 
  “type”: “type1”, 
  “date”: “Tue, 16 May 2017 07:09:33 +0000”, 
  “body”: 
  { 
     “formatA_1”: “aaa”, 
     “formatA_2”: “bbbcccddd” 
  } 
}

{ 
 “type”: “type_2”, 
 “date”: “Tue, 16 May 2017 07:09:33 +0000”, 
 “body”: 
 { 
    “formatB_1”: “alpha” 
 } 
} 

目前将有8种不同的类型。主要的不同是“身体”部分。

“body”部分可以有不同的格式和不同的内容,即使是 arraylist 或 null 也是可能的。

所以我设计的数据类是

public class Data {

    private String type;

    private Long date;

    private String body;

    public String getType() {
        return type;
    }

    public long getDate() {
        return date;
    }

    public String getBody() {
        return body;
    }
}

首先我认为这取决于类型,后来我可以解析正文字符串,但得到了异常:

    com.google.gson.JsonSyntaxException: 
java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 10 path $.body

这是我用嵌套的 body 类修改 Data 类的唯一方法吗?

公共类数据{

    private String type;

    private Long date;

    private Body body;

 private class Body {
    private String formatA_1;

    private String formatA_2;

    private String formatB_1;

    //even for the list and other data members...
 }

}

这个设计有点混乱,因为它包含了不同“类型”的所有成员(type1、type2、type3、...)。 我想成为基于不同“类型”的那个,我可以将主体解析为不同的对象(PO​​JO 表示主体)。那可能吗?

我刚开始学习使用Gson,不知道如何做出更好的设计和解析。

非常感谢。

【问题讨论】:

  • 它是 JSON(不是 Jason)。
  • 非常感谢。拼写错误。

标签: android gson


【解决方案1】:

在您要求避免嵌套对象的问题中,只有两种方法可以解决此问题,即手动解析数据,或在 POJO 中使用 @Expose 标签否则你必须按原样创建一个完整的 POJO。

虽然我建议使用http://www.jsonschema2pojo.org/ 自动解析来自 json 的 GSON POJO。

有关详细的解析示例,请参阅http://www.javadoc.io/doc/com.google.code.gson/gson/2.8.2

【讨论】:

  • 你能帮忙解释一下在POJO中使用@Expose标签吗?我不明白这是什么意思。非常感谢。
  • 此标签允许禁用 json POJO 的序列化或反序列化,更多详细信息请查看答案中的链接或read this
【解决方案2】:

此外,您可以将 class Body 定义为泛型类。

private String type;
private Long date;
private List<T> body;

您必须阅读有关如何解析泛型类的更多信息。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多