2014-04-29 20 views
7

Tôi có lớp sau đây:JSON - Không thể serialize JSONObject trong Object sử dụng Jackson

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

và tôi gọi Jacksons objectMapper.writeValueAsString(A) mà hoạt động tốt.

Bây giờ tôi cần thêm một thành viên dụ:

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 
} 

nhưng khi tôi serialize, tôi nhận được ngoại lệ:

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

tôi đã cố gắng JSONNode nhưng nó đã cho ra như {outerjson: " {innerjson} "} không phải là {outerjson: {innerjson}}.

Có thể sử dụng Jackson để đạt được kết quả trên, tức là JSONObject trong JSONObject không?

enter image description here

+1

Bạn có thể hiển thị kết quả mong đợi từ một đầu vào nhất định không? –

+2

Tại sao không sử dụng '' 'ObjectNode''' do Jackson cung cấp? – oceansize

Trả lời

0

Vâng, nếu bạn không thể thay thế JSONObject trên một POJO hoặc một bản đồ, sau đó bạn có thể viết một custom serializer. Dưới đây là một ví dụ:

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

Output:

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

Sử dụng JsonNode thay vì JSONObject.

JsonNode jsonNode = JsonLoader.fromString(YOUR_STRING); 
Các vấn đề liên quan