改进最佳实践,自定义gson解串器

时间:2015-11-19 11:38:56

标签: android gson retrofit json-deserialization

我有一个关于如何通过改造来执行这种反序列化的问题。

我有一个复杂的Json要解析:

{
  "key":"value",
  "rows" : [
    {  //type 1 object
      "type" : "the_type_1",
      "self" :{
          //type 1 subobject
      }
    },
    {  //type 2 object
      "type" : "the_type_2",
      "self" : {
          //type 2 subobject
      }
    },
    { //type 3 object
      "type" : "the_type_3",
      "self" : {  //type 2 object with different key
        "type" : "the_type_2",
         "target":{
            //type 2 subobject
         }
      }
    }
  ]
}

我的每一行都可以有非常不同的内容,我已经对它进行了简化,但是你可以看到我有一些嵌套对象,这些对象在json中的深度方面有一些关键变化。

所以我的第一个解决方案是构建包含每种可能性的每个键的巨大Gson模型,并稍后测试"类型"各种字段,以了解访问的内容。但它非常难以维护,因此并不优雅。

我想我可以使用Gson Stream mode和自定义改装转换器做一些事情,但我不确切知道从哪里开始,也不知道它是否是正确的方法。

你会做什么?

另外,我的帖子标题很糟糕,因为我没有提出更好的建议。请提出建议。

谢谢,

1 个答案:

答案 0 :(得分:0)

<强>更新

制作此课程

public class Target {

}

制作此Self.java

import com.google.gson.annotations.SerializedName;

public class Self {

    @SerializedName("type")
    private String type;

    @SerializedName("target")
    private Target target;

    public String getType() {
        return type;
    }

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

    public Target getTarget() {
        return target;
    }

    public void setTarget(Target target) {
        this.target = target;
    }
}

制作Row.java

import com.google.gson.annotations.SerializedName;

public class Row {

    @SerializedName("type")
    private String type;

    @SerializedName("self")
    private Self self;

    public String getType() {
        return type;
    }

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

    public Self getSelf() {
        return self;
    }

    public void setSelf(Self self) {
        this.self = self;
    }
}

这是Respones.java,它将使用gson

序列化
import java.util.ArrayList;

import com.google.gson.annotations.SerializedName;

public class Respones {

    @SerializedName("key")
    private String key;

    @SerializedName("rows")
    private ArrayList<Row> rows;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public ArrayList<Row> getRows() {
        return rows;
    }

    public void setRows(ArrayList<Row> rows) {
        this.rows = rows;
    }
}

以下是检查类是否正常的测试代码,

您可以在代码中使用上述模型类,但严格遵循代码来匹配您的数据,绝不是生成JSON数据的标准方法,您需要如何填充你的对象

import java.util.ArrayList;

import com.google.gson.Gson;

public class TestDrive {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Respones respones = new Respones();
        respones.setKey("value");
        ArrayList<Row> rows = new ArrayList<>();
        Row one = new Row();
        one.setType("the_type_1");
        one.setSelf(new Self());

        Row two = new Row();
        two.setType("the_type_2");
        two.setSelf(new Self());

        Row three = new Row();
        three.setType("the_type_3");
        Self self = new Self();
        self.setTarget(new Target());
        self.setType("the_type_2");
        three.setSelf(self);
        rows.add(one);
        rows.add(two);
        rows.add(three);
        respones.setRows(rows);

    /**
     * This code will convert your ArrayList object to a equivalent JSON
     * String
     */
    String result = (new Gson()).toJson(respones);
    System.out.println(""+result);


    /**
     * This code will convert your JSON String to a equivalent Response
     * Object
     */
    Respones respones2 = (new Gson()).fromJson(result, Respones.class);
    System.out.println(""+respones2.getKey());
    System.out.println(""+respones2.getRows().get(0).getType());
    System.out.println(""+respones2.getRows().get(2).getSelf().getType());
    }
}

输出

{
  "key": "value",
  "rows": [
    {
      "type": "the_type_1",
      "self": {

      }
    },
    {
      "type": "the_type_2",
      "self": {

      }
    },
    {
      "type": "the_type_3",
      "self": {
        "type": "the_type_2",
        "target": {

        }
      }
    }
  ]
}

value
the_type_1
the_type_2