2013-10-08 8 views
5

इस तरह की एक संरचना को देखते हुए की संपत्ति के रूप:जैक्सन JSON मानचित्र कुंजी निहित वस्तु

class Container { 
    Map<String, ScoreKeeper> scoreKeepers; 
} 

class ScoreKeeper { 
    String name; 
    int score; 
} 

ताकि आप की name संपत्ति के साथ अंत:

{ 
    "nameOfObject": { "score": 100 }, 
    "anotherObject": { "score": 30 } 
} 

को यह मैप करने के लिए क्या यह संभव है ScoreKeeper क्रमशः "nameOfObject" और "anotherObject" पर सेट किए गए हैं?

+1

आप शायद एक अंतर बनाने की आवश्यकता होगी मध्यस्थ वस्तु को क्रमबद्ध करने के लिए, जो बदले में आपके द्वारा प्रस्तुत प्रतिनिधित्व में परिवर्तित किया जा सकता है। – Bart

उत्तर

2

मैं आपके पीओजेओ को बाहरीकरण से अलग करने में दृढ़ आस्तिक हूं। (किसी भी लिखने की त्रुटियों की apols) एक मानचित्र में अपने JSON पढ़ें और फिर इस तरह आप कंटेनर/scorekeeper वस्तुओं का निर्माण:

mapper = new ObjectMapper(); 

Map<String,Object> data = mapper.readValue(inputstream, Map.class); 

Container c = new Container(); 

for(Map.Entry<String, Object> me : data.entrySet()) { 
    String key = me.getKey(); 
    Map info = (Map) me.getValue(); 

    ScoreKeeper sk = new ScoreKeeper(); 
    sk.setName(key); 
    Integer q = info.get("score"); 
    sk.setScore(q); 

    c.put(key, sk); 
} 
+0

निश्चित रूप से। मैं वास्तव में एक मौजूदा एपीआई deserialize करने के लिए एक संक्षिप्त तरीका की तलाश में था। फिर भी सुझाव के लिए धन्यवाद। –

2

वैकल्पिक समाधान है, जहां कुंजी name एक कस्टम deserializer का उपयोग करके मूल्य वस्तु पर सेट है:

@Test 
public void test() throws JsonParseException, JsonMappingException, IOException { 
    ObjectMapper mapper = new ObjectMapper(); 

    Data data = mapper.readValue("{\"users\": {\"John\": {\"id\": 20}, \"Pete\": {\"id\": 30}}}", Data.class); 

    assertEquals(20, data.users.get("John").id); 
    assertEquals(30, data.users.get("Pete").id); 
    assertEquals("John", data.users.get("John").name); 
    assertEquals("Pete", data.users.get("Pete").name); 
} 

public static class Data { 
    @JsonDeserialize(contentUsing = Deser.class) 
    public Map<String, User> users; 
} 

public static class User { 
    public String name; 
    public int id; 
} 

public static class Deser extends JsonDeserializer<User> { 

    @Override 
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     String name = ctxt.getParser().getCurrentName(); 

     User user = p.readValueAs(User.class); 

     user.name = name; // This copies the key name to the value object 

     return user; 
    } 
} 
+0

मैं अनुरोधित JSON (मूल प्रश्न में) के साथ काम करने के लिए इस दृष्टिकोण को प्राप्त करने में सक्षम नहीं था, यह दृष्टिकोण केवल तभी काम करता है जब रूट नाम नोड 'nameOfObject' और 'anotherObject' है – Nick

0

यहाँ @Buzz Moschetti के के एक उन्नत संस्करण है, यह का उपयोग करता जैक्सन के ObjectMapper.convertValue() गुण पार्स करने को संभालने के लिए है

ObjectMapper mapper = new ObjectMapper(); 

Map<String,Object> data = mapper.readValue(inputstream, Map.class); 

Container c = new Container(); 

for(Map.Entry<String, Object> entry : data.entrySet()) { 
    String name = entry.getKey(); 
    ScoreKeeper sk = mapper.convertValue(entry.getValue(), ScoreKeeper.class); 
    sk.name = name; 
    c.scoreKeepers.put(name, sk); 
} 
संबंधित मुद्दे