杰克逊:反序列化复杂的对象引用

时间:2018-05-31 05:11:28

标签: java json jackson

我正在调用一个返回复杂JSON的专有API:

{
    data: {
        id: 123,
        name: 'foo',
        createdBy: {
            id: 234,
            type: 'user'
        },
        currency: {
            id: 456,
            type: 'currency'
        }
    },
    links: {
        user: [
            {
                id: 234,
                fullName: 'Peter'
            }
        ],
        currency: [
            {
                id: 234,
                symbol: 'Euro'
            }
        ]
      }
 }

不是使用@idRef或类似的东西引用对象,而是使用具有两个属性的对象:类型和id。 然后我需要在链接结构中查找相应的对象。

是否可以使用Jackson将此JSON反序列化为:

public class Foo {
    private int id;
    private String name;
    private User createdBy;
    private Currency currency;
}

public class User {
    private int id;
    private String fullName;
}

public class Currency {
    private int id;
    private String symbol;
}

我试图找到“ObjectIdResolver”的答案,但我找不到实现此目的的方法。

1 个答案:

答案 0 :(得分:0)

您可以使用com.google.gson.Gson; lib将JSON字符串解析为java对象。 首先,您需要在JSON字符串上设计Java表示。

class DataObject{
    public Data data;
    public Links links;
}

class Links{
    public List<User> user;
    public List<Currency> currency;
}

class Data{
    public Long id;
    public String name;
    public CommanObject createdBy;
    public CommanObject currency;
}

class CommanObject{
    public Long id;
    public String type;
}
class User{
    public Long id;
    public String fullName;
}

class Currency{
    public Long id;
    public String symbol;
}

要解析JSON String,请尝试以下代码:

Gson gson = new Gson();
DataObject dataObject = gson.fromJson(metaDataString, DataObject.class);

第二个解决方案,因为你已经使用了Jackson lib,而不是尝试下面的一个:

ObjectMapper mapper = new ObjectMapper();
DataObject obj = mapper.readValue(jsonInString, DataObject.class);