【问题标题】:Make a "flat" JSON using Gson()使用 Gson() 制作“平面”JSON
【发布时间】:2015-05-07 10:09:00
【问题描述】:

我想制作一个类的“平面”JSON。

假设我有如下课程:

public class Parcel {
private double area;
private int type;
private Address address;
}

public class Address {
private String street;
private int number;
private int flatNumber;
}

有没有机会让 JSON 看起来像这样:

{
"area":0.0,
"type":1,
"Address.street":"street name",
"Address.number":22,
"Address.flatNumber":29
}

我不需要反序列化 JSON。我需要发给WS。

【问题讨论】:

  • 你试过了吗?
  • 有什么必要这样做?我的意思是,我不明白它的具体用途。
  • 你可以用一些代码(字符串操作)来做到这一点。我认为没有像这种奇怪格式这样的格式化库。
  • 不幸的是,我无法更改网络服务的工作方式,所以这就是我需要这种奇怪格式的原因。

标签: java android json gson


【解决方案1】:

一种选择是编写自定义序列化程序,以便您可以控制要发送的 json 方案。

private static class ParcelSerializer implements JsonSerializer<Parcel> {
    @Override
    public JsonElement serialize(Parcel src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject obj = new JsonObject();
        obj.addProperty("area", src.area);
        obj.addProperty("type", src.type);
        JsonObject addrObj = context.serialize(src.address, Address.class).getAsJsonObject();
        for(Map.Entry<String, JsonElement> e : addrObj.entrySet()) {
            obj.add("Address."+e.getKey(), e.getValue());
        }
        return obj;
    }
}

那你只需要注册到GsonBuilder:

Gson gson = new GsonBuilder().setPrettyPrinting().registerTypeAdapter(Parcel.class, new ParcelSerializer()).create();
String json = gson.toJson(p, Parcel.class);

根据您的示例,它会输出:

{
  "area": 0.0,
  "type": 1,
  "Address.street": "street name",
  "Address.number": 22,
  "Address.flatNumber": 29
}

【讨论】:

  • 非常感谢,没想到完整的解决方案:)
  • @rdkit 我以为这是一个简化的例子,但如果它是你的所有结构,那么它很酷:-)
  • 首先,它可以工作 :) 其次,我需要稍微重建它以使 Parcel 的所有剩余字段自动序列化。我想我需要使用反射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多