ObjectMapper 根据 json 值创建特定实例

问题描述 投票:0回答:1

我尝试使用 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”的值?这可能吗?

java android json objectmapper
1个回答
0
投票

您可以尝试创建一个客户映射器,例如:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.