2014-04-29 4 views
7

का उपयोग कर वस्तु के भीतर JSONObject क्रमानुसार करने में असमर्थ रहा निम्नलिखित वर्ग है:JSON जैक्सन

class A{  
    String abc; 
    String def; 
    // appropriate getters and setters with JsonProperty Annotation 
} 

और मैं Jacksons objectMapper.writeValueAsString(A) जो ठीक काम करता है कहते हैं।

अब मैं एक और उदाहरण सदस्य जोड़ने की जरूरत:

class A{  
    String abc; 
    String def; 
    JSONObject newMember; // No, I cannot Stringify it, it needs to be JSONObject 
    // appropriate getters and setters with JsonProperty Annotation 
} 

लेकिन जब मैं क्रमानुसार, मैं अपवाद हो रही है:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.json.JSONObject and no properties discovered to create BeanSerializer 

मैं JSONNode की कोशिश की लेकिन यह {outerjson के रूप में आउटपुट दिया: " {innerjson} "} नहीं {outerjson: {innerjson}}।

क्या उपरोक्त आउटपुट प्राप्त करने के लिए जैक्सन का उपयोग करना संभव है, यानी JSONObject JSONObject के भीतर?

enter image description here

+1

क्या आप किसी दिए गए इनपुट से अनुमानित आउटपुट दिखा सकते हैं? –

+2

जैक्सन द्वारा प्रदान किए गए '' ऑब्जेक्ट नोड''' का उपयोग क्यों न करें? – oceansize

उत्तर

0

ठीक है, यदि आप एक POJO या एक मानचित्र पर JSONObject को बदल नहीं सकते, तो आप एक custom serializer लिख सकते हैं। यहाँ एक उदाहरण है:

public class JacksonJSONObject { 

    public static class MyObject { 
     public final String string; 
     public final JSONObject object; 

     @JsonCreator 
     public MyObject(@JsonProperty("string") String string, @JsonProperty("object") JSONObject object) { 
      this.string = string; 
      this.object = object; 
     } 

     @Override 
     public String toString() { 
      return "MyObject{" + 
        "string='" + string + '\'' + 
        ", object=" + object + 
        '}'; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule("org.json"); 
     module.addSerializer(JSONObject.class, new JsonSerializer<JSONObject>() { 
      @Override 
      public void serialize(JSONObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException { 
      jgen.writeRawValue(value.toString()); 
      } 
     }); 
     module.addDeserializer(JSONObject.class, new JsonDeserializer<JSONObject>() { 
      @Override 
      public JSONObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { 
       Map<String, Object> bean = jp.readValueAs(new TypeReference<Map<String, Object>>() {}); 
       return new JSONObject(bean); 
      } 
     }); 
     mapper.registerModule(module); 
     JSONObject object = new JSONObject(Collections.singletonMap("key", "value")); 
     String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new MyObject("string", object)); 

     System.out.println("JSON: " + json); 
     System.out.println("Object: " + mapper.readValue(json, MyObject.class)); 
    } 
} 

आउटपुट:

JSON: { 
    "string" : "string", 
    "object" : {"key":"value"} 
} 
Object: MyObject{string='string', object={"key":"value"}} 
0

JSONObject के बजाय JsonNode का प्रयोग करें।

JsonNode jsonNode = JsonLoader.fromString(YOUR_STRING);