【问题标题】:JSON data mapping in Java with JacksonJava 中的 JSON 数据映射与 Jackson
【发布时间】:2021-09-01 15:28:44
【问题描述】:

我被困在仅使用 Jackson 装饰器“简单的方法”将 json 映射到我的数据结构中,我想知道是否有办法做到这一点......

我尝试读取的 json 具有以下结构:

{
   "animals": [
       {"data_info":{"ns":"dog"}, "sound":"bowwow", "bites":True},
       {"data_info":{"ns":"dog"}, "sound":"woofWoof", "bites":False},
       {"data_info":{"ns":"cat"}, "sound":"meeeOwww", "age":5}
    ],
    "data_info":{"ns":"animal"}
}

所以基本上每个数据实体都有一个“data_info”对象(在我的代码中从下面映射到 DataTypeInfo),它有一个包含对象类型的属性“ns”对象(在我的代码 TypeInfo 中映射)。所以这意味着对象类型的判别器总是在data_info.ns下

这是我的数据实体:

public class Animals extends DataTypeInfo {
    @JsonProperty("animals")
    List<Mamals> animals;
}

@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "data_info.ns")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Cat.class, name = "cat"),
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
})

public abstract class Mamals extends DataTypeInfo {    
}

public class Cat extends Mammals {
    @JsonProperty("sound")
    private String sound;
    @JsonProperty("age")
    private in age;
}

public class Dog extends Mammals {    
    @JsonProperty("sound")
    private String sound;
    @JsonProperty("bites")
    boolean bites    
}

public class DataTypeInfo {
    @JsonProperty("data_info")
    TypeInfo typeInfo;
}

public class TypeInfo {
    @JsonProperty("ns")
    String nameSpace;
}

我的代码中的错误是来自 Mammals 类的鉴别器:property = "data_info.ns" 因为这是为了使用属性,但我尝试使用子属性... 有没有办法正确声明 Mammal 抽象类的鉴别器,以便实例化正确的 Dog 或 Cat 对象?

【问题讨论】:

    标签: java json jackson jackson-databind


    【解决方案1】:

    我最终得到的解决方案是在抽象类中使用自定义构建器 (JsonCreator)(例如上面的哺乳动物)。

    我更新后的 Mammals 课程如下所示:

        @JsonCreator
    public static Mammals create(Map<String,Object> jsonMap) throws JsonProcessingException {
        Mammals result;
        Map type_info = (Map<String,String>) jsonMap.get("data_info");
        String type = (String) type_info.get("ns");
    
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(jsonMap);
        if (type.equals("cat")) {
            result = mapper.readValue(json, Cat.class);
        } else if (type.equals("dog")) {
            result = mapper.readValue(json, Dog.class);
        } else {
            throw new RuntimeException("Unknown entity type");
        }
        return result;
    }
    

    由于我的根类 (Animals) 包含一个哺乳动物列表,因此对于该列表的每个元素,都会执行此创建者来构建正确的哺乳动物实例(在我的示例中为猫或狗)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多