2014-04-29 42 views
7

kullanarak Nesne içinde JSONObject nesnesi seri edilemiyor Ben şu sınıf var:JSON Jackson

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

ve ben gayet iyi çalışıyor Jacksons objectMapper.writeValueAsString(A) diyoruz.

Şimdi başka örneği üye eklemek gerekir:

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 
} 

ama serialize zaman, ben istisna alıyorum: ":

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

Ben JSONNode denedik ama {outerjson olarak Çıktı verdi

{innerjson} "} değil {outerjson: {innerjson}}.

Yukarıdaki çıkışı elde etmek için Jackson'ı kullanmak mümkün mü, JSONObject JSONObject içinde mi? Eğer bir POJO veya harita üzerinde JSONObject nesnesi yerini alamaz eğer

enter image description here

+1

Belirli bir girdiden beklenen çıktıyı gösterebilir misiniz? –

+2

Neden Jackson tarafından sağlanan '' 'ObjectNode''' kullanılmıyor? – oceansize

cevap

0

Eh, o zaman bir custom serializer yazabilirsiniz. İşte bir örnek:

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)); 
    } 
} 

Çıktı:

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

yerine JSONObject nesnesi Kullanımı JsonNode.

JsonNode jsonNode = JsonLoader.fromString(YOUR_STRING); 
İlgili konular