Jackson将json字符串序列化为Java对象

时间:2016-06-26 06:25:54

标签: java json jackson

我有一个Json字符串,它有一个字符串消息字段。 字符串:

{  "Type" : "Text",
   "Subject" : "data received",
   "Message" :"{\\"language\\":\\"US\\",\\"data\\":\\"signature\\"}"
}

我想将其转换为以下结构: Notification.java

public class Notification {
  String type;
  String subject;
  Message message;
}

Message.java

public class Message {
  String language;
  String data;
}

有没有办法可以直接将字符串转换为上述结构的Java对象?我想避免反序列化两次。

4 个答案:

答案 0 :(得分:2)

您可以创建自定义Deserializer以将Message文本反序列化为Message对象,并使用Message注释@JsonDeserialize类:

@JsonDeserialize(using = MessageDeserializer.class)
public class Message {
    String language;
    String data;
}

public class MessageDeserializer extends JsonDeserializer<Message> {

    public MessageDeserializer() {
        super();
    }

    @Override
    public Message deserialize(
            final JsonParser jsonParser, final DeserializationContext deserializationContext) throws
            IOException, JsonProcessingException {
        final String messageText = jsonParser.getText(); 
        // parse messageText into Message object
    }
}

答案 1 :(得分:1)

我不确定我的解决方案是否可以接受,因为它需要对ObjectMapper进行额外的显式调用才能对Message的字符串值进行反序列化。
但是,这是在Notification对象的构建期间完成的,并且不需要String消息属性。

您需要将一个带有String参数的ctor添加到Message类,您可以在其中将String反序列化为Map并提取实例属性:

public Message(String str) {
    try {
        @SuppressWarnings("unchecked")
        Map<String, Object> map = 
                (Map<String, Object>)new ObjectMapper().readValue(str, Map.class);
        language = map.containsKey("language") ? map.get("language").toString() : null ;
        data = map.containsKey("data") ? map.get("data").toString() : null ;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

当您反序列化Notification对象时,Jackson会调用新的ctor:

Notification n = (Notification)new ObjectMapper().readValue(reader, Notification.class);

答案 2 :(得分:0)

您可以将Json字符串转换为Map中的键值对。您必须执行两次,因为@Component({ templateUrl: 'build/app.html', directives: [...], providers: [..., DataService] }) class MyApp{ // ... } 值再次是json字符串。使用Message表示JSONObject

org.json

然后通过遍历键并将值传递给类构造函数

来检索值

然后 Map<String, String> map = new HashMap<String, String>(); JSONObject j = new JSONObject(str); Iterator<String> keys = j.keys(); while( keys.hasNext() ){ String key = (String)keys.next(); String val = j.getString(key); map.put(key, val);} 可用于检索值,并将传递给类的构造函数。

答案 3 :(得分:0)

org.json库易于使用:

    //Create Json object to parse string
    // str is input string
    JSONObject obj = new JSONObject(str);

    //Create Message
    Message mess = new Message();
    JSONObject obj2 = new JSONObject(obj.getString("Message"));
    mess.data = obj2.getString("data");
    mess.language = obj2.getString("language");

    //Create Notification 
    Notification noti = new Notification();
    noti.message = mess;
    noti.subject = obj.getString("Subject");
    noti.type = obj.getString("Type");