2017-04-07 88 views
1

以下是将Json字符串转换为json的问题描述。从子对象映射json字段

Address{ 
    private long id; 
    private String city; 
} 

Employee{ 
    private long id; 
    private String name; 
    private Address address; 
} 

客户端会发送一个请求,以JSON员工

{"id": 1, "name": "ABC", "address": {"id": 1, "city": "XYZ"}} 

的现在我想输入JSON转换成以下格式,其中Address类的addressId = id字段。

Output{ 
    private long id; 
    private String name; 
    private long addressId; 
} 

有没有什么办法可以做到这一点。 我曾试过杰克逊和格森也。

+0

为什么不JSON.Parse整个对象然后选择孩子 –

+0

我想达到最好的办法是写一个自定义的Jackson解串器 – Apollo

回答

-1

您可以使用Gson api转换json的对象。

与下面的代码类似。不确定它是否没有语法错误。但是,这是可能的。

Gson gson = new Gson(); 
Employee emp = gson.fromJson("{"id": 1, "name": "ABC", "address": {"id": 1, "city": "XYZ"}}", 
    Employee.class); 

如果上面的代码不工作了,请尝试使用dozer

+0

我想将给定的json转换成Output类的形式。 –

+0

输出类的形式是什么意思?转换后您可以获取Employee对象。在你想要的地方使用它... – Shakthi

1

与杰克逊,你可以添加一个class AddressId包只用id场的地址和注释的构造函数的AddressId作为论据。根据需要添加getter和其他构造函数。这不需要仅定义EmployeeAddress类别Output

class Output { 
    private long id; 
    private String name; 
    private long addressId; 

    @JsonCreator 
    public Output(
      @JsonProperty("id") long id, 
      @JsonProperty("name") String name, 
      @JsonProperty("address") AddressId address) { 
     this.id = id; 
     this.name = name; 
     this.addressId = address.getId(); 
    } 
} 

class AddressId { 
    private long id; 
} 

在这种情况下,你也需要配置ObjectMapper悄悄地忽略未知JSON字段:

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

另一种选择,不需要class AddressId,将创建一个自定义的setter addressId字段基于Jackson在反序列化时内部使用的Map<String, Object>。这是怎么Output看起来像在这种情况下(添加可能需要的其它设置器/吸气):

class Output { 
    private long id; 
    private String name; 

    @JsonProperty("address") 
    public void setAddressId(final Map<String, Object> address) { 
     addressId = (Integer) address.get("id"); 
    } 

    private long addressId; 
} 
+0

我不想创建单独的类“AddressId” –

+0

在你的代码中定义了“class Address”吗? –

+0

不,地址不在接收端 –