gpt4 book ai didi

java - 使用 Jackson 将映射编码到对象

转载 作者:行者123 更新时间:2023-12-02 05:09:38 25 4
gpt4 key购买 nike

我正在使用 Jackson 将 json 调用编码到 Web 应用程序,并且我正在尝试设计一种接受许多不同对象的方法。

例如:

我有两个类结构

{
name:"Joe",
surname:"Bloggs"
}

对应java类Person

{
address1:"21 Main st",
city:"Georgetown",
zip:"12345"
}

对应java类地址

现在我想进行一个可以以这种方式处理这些类中的任何一个的调用:

 {
type:"Person",
data:{
name:"Joe",
surname:"Bloggs"
}
}

我可以创建一个调用,将上述请求编码到 Map,或者我可以创建两个单独的请求,每个请求对应一个对象结构,并将它们直接编码到相应的类中。

是否可以使用 jackson 将上述请求编码到 map ,然后在读取 map 的一部分后——例如map.get("type")——使用 Jackson 来编码子对象——例如map.get("data")--进入相应的java类而不重新转换回json?

最佳答案

您可以使用 Jackson 多态性。这是一个简单的例子:

public class Polymorphism3Main {

public static void main(String []args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();

String json = objectMapper.writeValueAsString(generatePerson());
System.out.println("json = " + json);
System.out.println(objectMapper.readValue(json, Request.class));

json = objectMapper.writeValueAsString(generateAddress());
System.out.println("json = " + json);
System.out.println(objectMapper.readValue(json, Request.class));
}

private static Person generatePerson() {
Person result = new Person();
result.setName("name");
result.setSurname("surname");
return result;
}

private static Address generateAddress() {
Address address = new Address();
address.setAddress1("address 1");
address.setCity("city");
address.setZip("324212");
return address;
}
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = Person.class, name = "person"),
@JsonSubTypes.Type(value = Address.class, name = "address")
})
interface Request {
}

class Person implements Request {
private String name;
private String surname;
}

class Address implements Request {
private String address1;
private String city;
private String zip;
}

该代码将生成略有不同的 json,但它仍然适用:

{"person":{"name":"name","surname":"surname"}}
{"address":{"address1":"address 1","city":"city","zip":"324212"}}

如果您想拥有与您发布的完全相同的 json 格式 - 您将需要创建一个包装对象。

一般来说,我建议创建两个单独的方法来以不同的方式处理这两个请求。在这种情况下,您的代码会更加干净,并且不需要通过 Request 接口(interface)将 Person 与 Address 结合起来。

关于java - 使用 Jackson 将映射编码到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com