json对象的序列化和反序列化

时间:2016-07-17 17:21:01

标签: java json serialization gson deserialization

所以我想解析服务器的响应。目的是构建统一的系统,它将接收响应并构建对象,而不是将其序列化。

服务器有4种类型的响应:

类型1 :items是具有两个或更多键值项的对象数组;

{
  "response": {
    "count": 1,
    "items": [
      {
        "id": 456239048,
        "key1": "value_1",
        "key2": "value_2"
      }
    ]
  }
}

类型2 :项目还可以有另一个内部对象,例如city;

{
  "response": {
    "count": 923,
    "items": [
      {
        "id": 1,
        "first_name": "Test",
        "last_name": "Test",
        "city": {
          "id": 2,
          "title": "city1"
        }
      },
      {
        "id": 2,
        "first_name": "Test2",
        "last_name": "Test2"
      }
    ]
  }
}

最后是最后两种类型的回应:

{
  "response": [
    {
      "id": 1
    }
  ]
}

第二个

{
  "error": {
    "error_code": 14
  }
}

它们是服务器条件的响应等等。

所以我实现了几个类来实现我的目标。 还有更多时间:   - 序列化和反序列化(json1 => object => json2; json1 = json2);   - 访问对象方法和值。

public class DataModelDeserializer<T> implements JsonDeserializer<T> {

        @Override
        public T deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
            JsonElement items=null;

            try{
                items = jsonElement.getAsJsonObject();
            }catch (Exception e){
                e.printStackTrace();
            }

            return new Gson().fromJson(items, type);
        }
    }

DataModel.java

    public class DataModel {
    private Response response;


    public Response getResponse() {
        return response;
    }

    public void setResponse(Response response) {
        this.response = response;
    }


}

Response.java

    public class Response<T> {
    private int count;
    private List<T> items=new ArrayList<T>();
    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public List<T> getItems() {
        return items;
    }

    public void setItems(List<T> items) {
        this.items = items;
    }
}

Items.java

 public class Items {
        private int id;
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }
     }

从一个好消息开始 - 这种方法帮助我实现了第一个目标 - 隐藏json来反对和反击。 Hovewer我无法访问Items对象的值;我收到一个错误:

  

线程“main”中的异常java.lang.ClassCastException:com.google.gson.internal.StringMap无法强制转换为com.app.Items

是的,我认为这种方法并不是很好,因为我遇到了如何确定响应类型的问题。

感谢。

1 个答案:

答案 0 :(得分:1)

将响应格式更改为响应类型的标准格式。

{
    "success":"true",
    "responseData": {
        // your data here
    },
    "errorMessage": "only set if success == false",
    "errorData": {
        // any error data here
    }
}

然后,您可以对所有类型的响应使用相同的解析逻辑,同时提前知道基于success字段的值的响应类型。