2013-07-28 23 views
6

böyle json vardır:Jackson ayrıştırma JSON

{ 

    "users":{ 
      "1234":{ 
       "firstname":"Joe", 
       "lastname":"Smith" 
      }, 
      "9876":{ 
       "firstname":"Bob", 
       "lastname":"Anderson" 
      } 
    }, 
    "jobs":[ 
      { 
       "id":"abc", 
       "location":"store" 
      }, 
      { 
       "id":"def", 
       "location":"factory" 
      } 
    ] 
} 

Bu kullanarak Jackson ayrıştırma ve böylece kullanarak yanıt ayrıştırma edilmiştir: readvalue (

public class MyCustomClass{ 
     @JsonProperty("jobs") 
     ArrayList<Job> jobs; 

     @JsonProperty("users") 
     ArrayList<UserMap> usersMap; 
} 

Şimdi işler İşler nesnelerin içine mükemmel ayrıştırmak ama onlar dinamik tuşları var çünkü kullanıcılar ayrıştırmak için alamayan gibi MyCustomClass görünüyor json, MyCustomClass.class)

. Ben JsonAnyGetter/Setter hakkında okumak ve bir dize eşler UserMap nesne haritası yapma çalıştı -> Kullanıcı gibi:

public class UserMap { 

private HashMap<String,User> usersMap; 


@JsonAnySetter 
public void add(String key, User user){ 
    usersMap.put(key, user); 
} 

@JsonAnyGetter 
public Map<String, User> getUsersMap(){ 
    return usersMap; 
} 


} 

ama bu çalışmıyor. Bunu bir TypeReference sarıcısıyla yapabileceğimi düşünüyorum, ancak bu haritaların geri dönecek tek tip olması durumunda bunu yapmanın bir yolunu düşünebilirim. Farklı türler aldığım için (kullanıcılar ve işler) bunu yapmak mümkün mü?

+0

Kişisel json geçerli değil. Örneğin, "Anderson" dan sonra, –

+0

'dan sonra üzüldüm. Bu yazım bana bir yazım hatası oldu, düzeltildi. Şimdi geçerli bir json olmalı. – pat

cevap

9

Çözüm:

public class MyCustomClass { 
    @JsonProperty("users") 
    public LinkedHashMap<String, User> users; 

    @JsonProperty("jobs") 
    public ArrayList<Job> jobs; 
}  
0

Muhtemelen kendi özel serpicilerinizi yazarak ve kullandığınız nesne eşleştiricisi ile kaydederek bunu aşabilirsiniz. Bu, her nesnenin Kullanıcı nesnesine nasıl seri hale getirildiğinin tam kontrolüne sahip olacağından çalışmalıdır.

Kendi desperizatörünüzün nasıl döndürüleceği hakkında this jackson documentation konusuna bakın.

Ayrıca, json yapısı üzerinde kontrole sahip olmanız durumunda - varlığın karşılığının gerçek json nesnesinin bir parçası olması için anahtar değerin (ki bunun kullanıcı için bir kimlik olduğunu tahmin ediyorum) değiştireceğini de söylemek isterim. anahtar. Bu, hep birlikte sorunu önlemenize yardımcı olacaktır. Örneğin

:

"users":{ 
     { 
      "id":"1234", 
      "firstname":"Joe", 
      "lastname":"Smith" 
     }, 
     { 
      "id":"9876", 
      "firstname":"Bob", 
      "lastname":"Anderson" 
     }