2016-04-04 22 views
0

ile ayrıştırma yapamıyorum Aşağıdaki yapıya sahip JSON verilerim var. Aynı yapıya ve aynı isimle POJO'lar oluşturmaya çalıştım. Bir listeyi (aşağıdaki JSON'da sayısal nesnelerin yapısını içeren DTO'lar) ve bir "Bildirimi" içeren bir DTO aldım. Verileri DTO’da bulamıyorum.JSON verisini POJO

{ 
    "notice": "This API is in a pre-launch state, and will go through significant changes.", 
    "1": { 
     "next_renewal_date": "2014-08-01", 
     "next_renewal_fee": { 
      "price": "800.0", 
      "currency": "USD" 
     }, 
     "next_renewal_description": "1st Annuity - Official Fee", 
     "next_per_claim_fee": { 
      "price": "0.0", 
      "currency": "USD", 
      "free_claims": 0, 
      "claim_type": "claims_count" 
     }, 
     "next_agent_fee": { 
      "price": "0.0", 
      "currency": "USD" 
     }, 
     "grace_period_end_date": "2015-02-01" 
    }, 
    "2": { 
     "next_renewal_date": "2018-08-01", 
     "next_renewal_fee": { 
      "price": "1800.0", 
      "currency": "USD" 
     }, 
     "next_renewal_description": "2nd Annuity - Official Fee", 
     "next_per_claim_fee": { 
      "price": "0.0", 
      "currency": "USD", 
      "free_claims": 0, 
      "claim_type": "claims_count" 
     }, 
     "next_agent_fee": { 
      "price": "0.0", 
      "currency": "USD" 
     }, 
     "grace_period_end_date": "2019-02-01" 
    } 
} 

POJO:

public class RenewalAPICallListDTO { 
    private Map<Integer,JSONCallDto> apiCallList; 

    public Map<Integer, JSONCallDto> getApiCallList() { 
     return apiCallList; 
    } 
    public void setApiCallList(Map<Integer, JSONCallDto> apiCallList) { 
     this.apiCallList = apiCallList; 
    } 
    private String notice; 

    public String getNotice() { 
     return notice; 
    } 
    public void setNotice(String notice) { 
     this.notice = notice; 
    } 
} 

Yöntem çağrı:

Gson gson = new Gson(); 
RenewalAPICallListDTO respDto = gson.fromJson(response1.toString(), RenewalAPICallListDTO.class); 
+0

POJO'nuzu ve json'u ayrıştırmak için kullandığınız her şeyi gösterin. – dambros

+0

Gson gson = yeni Gson(); RenewalAPICallListDTO respDto = gson.fromJson (response1.toString(), RenewalAPICallListDTO.class); –

+0

public class RenewalAPICallListDTO { \t Özel Harita apiCallList; \t halka açık harita getApiCallList() { \t \t return apiCallList; \t} \t public void setApiCallList (Harita apiCallList) { \t \t this.apiCallList = apiCallList; Özel "Dize"; \t \t public String getNotice() { \t \t İade bildirimi; \t} \t public void setNotice (String bildirimi) { \t \t this.notice = bildirim; \t} \t \t } –

cevap

0

aşağıdaki gibi özel bir deserializer ile Jackson ile elde edilebilir Aradığınız Ne:

public class CustomDeserializer extends JsonDeserializer<RenewalAPICallListDTO> { 

    private static final ObjectMapper mapper = new ObjectMapper(); 

    static { 
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    } 

    @Override 
    public RenewalAPICallListDTO deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException { 


     JsonNode node = jp.getCodec().readTree(jp); 

     Iterator<Entry<String, JsonNode>> nodeIterator = node.fields(); 

     RenewalAPICallListDTO dto = new RenewalAPICallListDTO(); 
     Map<Integer, JsonCallDto> map = new HashMap<>(); 

     while (nodeIterator.hasNext()) { 
      Map.Entry<String, JsonNode> entry = nodeIterator.next(); 
      if (entry.getKey().equalsIgnoreCase("notice")) { 
       dto.setNotice(entry.getValue().toString()); 
      } else { 
       map.put(Integer.parseInt(entry.getKey()), mapper.readValue(entry.getValue().toString(), JsonCallDto.class)); 
      } 
     } 
     dto.setApiCallList(map); 
     return dto; 
    } 

} 

Kullanımı: İstediğiniz gibi

public static void main(String[] args) throws Exception { 

    ObjectMapper mapper = new ObjectMapper(); 
    SimpleModule module = new SimpleModule(); 
    module.addDeserializer(RenewalAPICallListDTO.class, new CustomDeserializer()); 
    mapper.registerModule(module); 

    RenewalAPICallListDTO dto = mapper.readValue(JSON, RenewalAPICallListDTO.class); 
} 

son dto doğru serileştirilebilir olacak, zaten ayarlanmış doğru tiplerde bile.

+0

Teşekkürler @dambros! –

0

json ve POJO uyuşmuyor. JSON dizenizde apiCallList özniteliği eksik. Bir yol bulduk

{ 
    "notice": "random string", 
    "apiCallList": { 
     "1": { 
      "next_renewal_date": "2014-08-01", 
      ... 
     }, 
     "2": { 
      "next_renewal_date": "2014-08-01", 
      .... 
     } 
    } 
} 
+0

Evet, sorun çözülmüş olmalı ama JSON değiştiremiyorum. –

0

: gibi

yapısı olmalıdır. Yardım için teşekkürler. JSON'u Hashmap'i kullanarak dönüştürdüm: Harita verileri = mapper.readValue (json, Map.class); ve sonra POJO'ları doldurmak için nesneleri kullanarak haritayı yineledi.