jackson ObjectMapper基于json值创建特定示例[重复]

t3psigkw  于 7个月前  发布在  其他
关注(0)|答案(3)|浏览(70)

此问题已在此处有答案

Deserialize JSON with Jackson into Polymorphic Types - A Complete Example is giving me a compile error(7个回答)
2个月前关闭。
我尝试使用ObjectMapper反序列化JSON,但遇到了一些问题。也许我想要的是不可能与ObjectMapper,但我会要求无论如何一个好的方法。假设我有一个类,其中包含这样的对象列表:

public class SomeClass {

    ArrayList<BaseClass> list;
}
public class BaseClass {
    String id;
    String type;
}
public class MyClass1 extends BaseClass{

}
public class MyClass2 extends BaseClass{

}

一个JSON是这样的:

{
    "list": [
      {
        "id": "1",
        "type": "MyClass1",
      },
      {
        "id": "2",
        "type": "MyClass2",
      },
      {
        "id": "3",
        "type": "MyClass1",
      }
    ]
}

问题是如何告诉ObjectMapper创建并放入列表中的不是BaseClass对象,而是MyClass1, MyClass2...对象,这取决于“type”的值?这可能吗?

csbfibhn

csbfibhn1#

请参见Jackson多态类型处理注解
你应该能够做一些像

@JsonTypeInfo(
   use = JsonTypeInfo.Id.NAME, 
   include = As.PROPERTY, 
   property = "type"
)
@JsonSubTypes({
   @JsonSubTypes.Type(value = MyClass1.class, name = "MyClass1"),
   @JsonSubTypes.Type(value = MyClass2.class, name = "MyClass2")
})
public class BaseClass {
    String id;
    String type;
}
mspsb9vt

mspsb9vt2#

您可以简单地使用Jackson注解来实现这一点:

@JsonTypeInfo(use = NAME, property = "type")
@JsonSubTypes(
  @Type(MyClass1.class, name = "MyClass1"),
  @Type(MyClass2.class, name = "MyClass2")
)
public class BaseClass {
  String id;
}

您可能还想查看use的其他值,例如CLASSMINIMAL_CLASS

dgenwo3n

dgenwo3n3#

您可以尝试创建一个客户Map器,类似于:

public class CustomDeserializer extends JsonDeserializer<BaseClass> {
    @Override
    public BaseClass deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);
        String type = node.get("type").asText();
        String id = node.get("id").asText();
        
        if ("MyClass1".equals(type)) {
            MyClass1 myClass1 = new MyClass1();
            myClass1.id = id;
            myClass1.type = type;
            return myClass1;
        } else if ("MyClass2".equals(type)) {
            MyClass2 myClass2 = new MyClass2();
            myClass2.id = id;
            myClass2.type = type;
            return myClass2;
        }
        return null; // or throw an exception
    }
}
public class SomeClass {
    @JsonDeserialize(contentUsing = CustomDeserializer.class)
    ArrayList<BaseClass> list;
}

相关问题