【问题标题】:Custom POJO serializer using Gson @JsonAdapter annotation使用 Gson @JsonAdapter 注解的自定义 POJO 序列化程序
【发布时间】:2018-04-13 10:12:17
【问题描述】:

我正在使用 Gson 库的 @JsonAdapter 注释将我的 JSON 对象序列化/反序列化为 POJO。

反序列化工作正常,但序列化给了我这个

 {
    "name": "ana",
    "email": "test@test.co.uk",
    "address": {
        "address_line1": "123 Some Address",
        "address_line2": "",
        "address_city": "My city",
        "address_postalcode": "CV31 9GP"
    }
}

而不是

{
    "name": "ana",
    "email": "test@test.co.uk",
    "address_line1": "123 Some Address",
    "address_line2": "",
    "address_city": "My city",
    "address_postalcode": "CV31 9GP"
}

这是因为我返回了一个 JsonElement,但我看不到另一种序列化我的 Address 对象的方法。

有没有办法返回外部键值对?

User.java:

public class User() {
    private String name;
    private String email;

    @JsonAdapter(AddressSerializer.class)
    private Address address;
    ...
}

AddressSerializer.java

public class AddressSerializer implements JsonSerializer<Address> {

    @Override
    public JsonElement serialize(Address src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonAddress = new JsonObject();

        jsonAddress.addProperty("address_line1", src.getAddressLine1());
        jsonAddress.addProperty("address_line2", src.getAddressLine2());
        jsonAddress.addProperty("address_city", src.getCity());
        jsonAddress.addProperty("address_postalcode", src.getPostcode());

        return jsonAddress;
    }
}

【问题讨论】:

  • 您在 User 中有 Address pojo 类,这就是您会这样的原因。它应该像名字一样

标签: java android json serialization gson


【解决方案1】:

你试过@JsonUnwrapped吗?

编辑:但是,正如@srnu 指出的那样,您现在得到的 JSON 是标准表示,它表明 Address 是一个不同的对象。否则看起来所有属性都属于用户。

【讨论】:

  • 是的,有道理!我创建了这个地址对象,以便在我的其他接收地址相同的 4 个键的类中重用。我正在尝试找到一种方法将地址键带到其父级,与“名称”键处于同一级别。
  • @JsonUnwrapped 私有地址地址;
  • @JsonUnwrapped 不是 Jackson 注释吗?
  • 是的,@JsonUnwrapped 是 Jackson 注释。我相信目前在 Gson 中没有类似的东西。 here 他们似乎在谈论另一种选择。
【解决方案2】:

似乎与this问题有关。

你可以为你的用户序列化器做类似的事情:

public class UserSerializer implements JsonSerializer<User> {

    @Override
    public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonUser = new JsonObject();

        jsonUser.addProperty("name", src.getName());
        jsonUser.addProperty("email", src.getEmail());
        jsonUser.addProperty("address_line1", src.getAddress().getAddressLine1());
        jsonUser.addProperty("address_line2", src.getAddress().getAddressLine2());
        jsonUser.addProperty("address_city", src.getAddress().getCity());
        jsonUser.addProperty("address_postalcode", src.getAddress().getPostcode());

        return jsonUser;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2013-03-09
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多