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

Jackson将json字符串双重序列化为Java对象,java,json,jackson,Java,Json,Jackson,我有一个Json字符串,它有一个字符串消息字段。 字符串: 我想将其转换为以下结构: Notification.java public class Notification { String type; String subject; Message message; } Message.java public class Message { String language; String data; } 有没有一种方法可以直接将字符串转换为上述结构的Java对象?我希望

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

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

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

public class Message {
  String language;
  String data;
}

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

我不确定我的解决方案是否可以接受,因为它确实需要额外显式调用
ObjectMapper
来执行
消息的字符串值的反序列化
但是,这是在构建
通知
对象期间完成的,不需要字符串消息属性

您需要向
Message
类添加一个带字符串参数的ctor,在该类中,您可以将字符串反序列化为映射并提取实例属性:

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

您可以将json字符串转换为Map中的键值对。您必须执行两次操作,因为
消息
值再次是json字符串。对于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);}
Map Map=newhashmap();
JSONObject j=新的JSONObject(str);
迭代器键=j.keys();
while(keys.hasNext()){
字符串键=(字符串)键。下一步();
字符串val=j.getString(键);
map.put(key,val);}
然后通过迭代键来检索值,并将值传递给类构造函数

然后可以使用
map.get(key)
检索值,并将其传递给类的构造函数。

该库易于使用:

    //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");

您可以创建一个自定义的
反序列化程序
,将
消息
文本反序列化为
消息
对象,并使用
@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
    }
}
@JsonDeserialize(使用=MessageDeserializer.class)
公共类消息{
字符串语言;
字符串数据;
}
公共类MessageDeserializer扩展JsonDeserializer{
公共消息反序列化程序(){
超级();
}
@凌驾
公共消息反序列化(
最终JsonParser JsonParser,最终反序列化上下文(反序列化上下文)抛出
IOException,JsonProcessingException{
最后一个字符串messageText=jsonParser.getText();
//将messageText解析为Message对象
}
}

您的问题不清楚。首先,您提到从对象到字符串的双重序列化,然后询问从字符串到对象的反序列化消息字段不是json结构类型,而是json字符串。所以我必须将它转换为一个通知对象,字段message作为字符串,然后将消息字符串转换为message对象。谢谢你的澄清
    //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");
@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
    }
}