java - JSON深度映射

标签 java android json jackson gson

是否可以将 json 响应中较深的字段映射到对象中的属性 - 换句话说:将具有层次结构的 json 转换为平面对象?

例如,我想用“links.user.id”注释 Marker 类的“user_id”属性。 我调查了 GSON 和 Jackson,但找不到解决方案。

标记的 Json 响应:

{
  "id": 791,
  "name": "Marker42",
  "links": {
    "user": {
      "href": "http://4242.com/users/970",
      "id": 970
  }
}

数据模型:

public class Marker {
    @SerializedName("id")
    private int id;

    @SerializedName("name")
    private String name;

    @SerializedName("links.user.id")
    private int user_id;
}

最佳答案

这不是很漂亮,但您可以在 GSON 中设置自己的反序列化器。我对 Jackson 不太熟悉,但本教程展示了一种非常相似的方法:http://www.baeldung.com/jackson-deserialization

public static class MarkerGSONDeserializer implements JsonDeserializer<Marker>{

    @Override
    public Marker deserialize(JsonElement data, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        if(!data.isJsonObject()){
            return null;
        } else {
            JsonObject obj = data.getAsJsonObject();
            Marker res = new Marker();
            res.setId(obj.get("id").getAsInt());
            res.setName(obj.get("name").getAsString());
            res.setUserId(((obj.get("links").getAsJsonObject())).get("user").getAsJsonObject()).get("id").getAsInt();
            return res;
        }
    }

}

关于java - JSON深度映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27804526/

相关文章:

javascript - 从 JSON 中的现有数据创建日期显示

javascript - 无法删除具有空值的 JSON 项目

java - 将时区名称转换为城市名称(删除大洲部分)

java - 根据java逻辑在运行时生成一个类

java - 插入命名属性值,a la Ant

javascript - 如何在Google Map iOS SDK上隐藏商业位置

java - 更改标准小部件的外观

java - 使用 Chef Java Recipe 时如何访问 java_home

Android : If not hard-coded encryption key, 加密 key 保存位置

json - 结构中的泛化 - golang