2014-04-03 65 views
2

我有一個有趣的JSON解析問題,至少對我來說,因爲我是第一次這樣做。我有以下的樣品JSON,我想它映射到等價的DTO:將Json轉換爲DTO數組

{ 
    "modules": 
    [ 
     { 
      "name":"module1", 
      "shortId":23425, 
      "pmns": 
      [ 
       { 
        "name":"pmn1", 
        "position":1, 
        "pmnType":"D3" 
       }, 
       { 
        "name":"pmn3", 
        "position":3, 
        "pmnType":"R2" 
       }, 
       { 
        "name":"pmn7", 
        "position":5, 
        "pmnType":"S1" 
       }, 
      ] 
     }, 
     { 
      "name":"module2", 
      "shortId":1572, 
      "pmns": 
      [ 
       { 
        "name":"pmn1", 
        "position":3, 
        "pmnType":"D3" 
       }, 
       { 
        "name":"pmn12", 
        "position":35, 
        "pmnType":"R2" 
       }, 
      ] 
     } 
    ] 
} 

這是我ModuleDTO類:

public class ModuleDTO { 

    private String _name; 
    private short _shortId; 
    private PmnDTO[] _pmns; 

    public String getName() { 
     return _name; 
    } 

    public short getShortId() { 
     return _shortId; 
    } 

    public PmnDTO[] getPmns() { 
     return _pmns; 
    } 

    @JsonProperty("name") 
    public void setName(String name) { 
     this._name = name; 
    } 

    @JsonProperty("shortId") 
    public void setShortId(short shortId) { 
     this._shortId = shortId; 
    } 

    @JsonProperty("pmns") 
    public void setPmns(PmnDTO[] pmns) { 
     this._pmns = pmns; 
    } 

} 

這裏不是複製的,但我PmnDTO類是類似的,即getter和setter對於JSON的pmn對象中的每個屬性。

我寫了下面的代碼,試圖將它映射到DTO。我使用的庫com.FasterXml.jackson(2.3.1版本)

// Got the response, construct a DTOs out of it ... 
ObjectMapper mapper = new ObjectMapper(); 
StringReader reader = new StringReader(response); // Json Response 

// Convert the JSON response to appropriate DTO ... 
ModuleDTO moduleDto = mapper.readValue(reader, ModuleDTO.class); 

很顯然,這個代碼沒有工作。有人可以告訴我,如何將JSON響應映射到我的DTO,因爲「模塊」是JSON中的數組,並且它本身也包含可變大小的數組。

謝謝。

(* Vipul)();

+0

_明顯_並不意味着什麼。告訴我們它是如何失敗的,它拋出什麼異常以及你期望發生什麼。 –

+1

您擁有的Json結構不會映射到您的DTO。它匹配ModuleDTO的Array。您可以使用單個屬性ArrayList 模塊定義ModuleList類;然後將ModuleList.class傳遞給解析器 – hellboy

+1

3歡呼聲給你bellboy :-)我根據你的建議和賓果定義了以下類! ------ package com.sgsi.modulestructure.dto; import java.util.ArrayList; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) public class ModuleListDTO { \t private ArrayList modules; \t public ArrayList getModule(){ \t \t return this。模塊; \t} @JsonProperty( 「模塊」) \t公共無效setModule(ArrayList的模塊){ \t \t this.modules =模塊; \t} } 謝謝。 – sgsi

回答

2

所有的JSON的首先是無效的,所以我懷疑你想要這個:

{ 
    "modules": [ 
     { 
      "name": "module1", 
      "shortId": 23425, 
      "pmns": [ 
       { 
        "name": "pmn1", 
        "position": 1, 
        "pmnType": "D3" 
       }, 
       { 
        "name": "pmn3", 
        "position": 3, 
        "pmnType": "R2" 
       }, 
       { 
        "name": "pmn7", 
        "position": 5, 
        "pmnType": "S1" 
       } 
      ] 
     }, 
     { 
      "name": "module2", 
      "shortId": 1572, 
      "pmns": [ 
       { 
        "name": "pmn1", 
        "position": 3, 
        "pmnType": "D3" 
       }, 
       { 
        "name": "pmn12", 
        "position": 35, 
        "pmnType": "R2" 
       } 
      ] 
     } 
    ] 
} 

然後你可以使用JSON從網上轉換成POJO here,你會得到follwing結果:

----------------------------------- com.example.Example.java ------ -----------------------------

package com.example; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.annotation.Generated; 
import javax.validation.Valid; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Generated("org.jsonschema2pojo") 
@JsonPropertyOrder({ 
"modules" 
}) 
public class Example { 

@JsonProperty("modules") 
@Valid 
private List<Module> modules = new ArrayList<Module>(); 
@JsonIgnore 
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

@JsonProperty("modules") 
public List<Module> getModules() { 
return modules; 
} 

@JsonProperty("modules") 
public void setModules(List<Module> modules) { 
this.modules = modules; 
} 

@JsonAnyGetter 
public Map<String, Object> getAdditionalProperties() { 
return this.additionalProperties; 
} 

@JsonAnySetter 
public void setAdditionalProperty(String name, Object value) { 
this.additionalProperties.put(name, value); 
} 

} 

-------------- --------------------- com.exa mple.Module.java -----------------------------------

package com.example; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.annotation.Generated; 
import javax.validation.Valid; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Generated("org.jsonschema2pojo") 
@JsonPropertyOrder({ 
"name", 
"shortId", 
"pmns" 
}) 
public class Module { 

@JsonProperty("name") 
private String name; 
@JsonProperty("shortId") 
private Integer shortId; 
@JsonProperty("pmns") 
@Valid 
private List<Pmn> pmns = new ArrayList<Pmn>(); 
@JsonIgnore 
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

@JsonProperty("name") 
public String getName() { 
return name; 
} 

@JsonProperty("name") 
public void setName(String name) { 
this.name = name; 
} 

@JsonProperty("shortId") 
public Integer getShortId() { 
return shortId; 
} 

@JsonProperty("shortId") 
public void setShortId(Integer shortId) { 
this.shortId = shortId; 
} 

@JsonProperty("pmns") 
public List<Pmn> getPmns() { 
return pmns; 
} 

@JsonProperty("pmns") 
public void setPmns(List<Pmn> pmns) { 
this.pmns = pmns; 
} 

@JsonAnyGetter 
public Map<String, Object> getAdditionalProperties() { 
return this.additionalProperties; 
} 

@JsonAnySetter 
public void setAdditionalProperty(String name, Object value) { 
this.additionalProperties.put(name, value); 
} 

} 

--- -------------------------------- com.example.Pmn.java ----------- ------------------------

package com.example; 

import java.util.HashMap; 
import java.util.Map; 
import javax.annotation.Generated; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Generated("org.jsonschema2pojo") 
@JsonPropertyOrder({ 
"name", 
"position", 
"pmnType" 
}) 
public class Pmn { 

@JsonProperty("name") 
private String name; 
@JsonProperty("position") 
private Integer position; 
@JsonProperty("pmnType") 
private String pmnType; 
@JsonIgnore 
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

@JsonProperty("name") 
public String getName() { 
return name; 
} 

@JsonProperty("name") 
public void setName(String name) { 
this.name = name; 
} 

@JsonProperty("position") 
public Integer getPosition() { 
return position; 
} 

@JsonProperty("position") 
public void setPosition(Integer position) { 
this.position = position; 
} 

@JsonProperty("pmnType") 
public String getPmnType() { 
return pmnType; 
} 

@JsonProperty("pmnType") 
public void setPmnType(String pmnType) { 
this.pmnType = pmnType; 
} 

@JsonAnyGetter 
public Map<String, Object> getAdditionalProperties() { 
return this.additionalProperties; 
} 

@JsonAnySetter 
public void setAdditionalProperty(String name, Object value) { 
this.additionalProperties.put(name, value); 
} 

} 
+0

這可以在不創建POJO類的情況下完成。我的意思是直接轉換爲DTO對象。 – warrior107