2017-04-07 90 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

不,地址不在接收端 –