Jackson将json字符串双重序列化为Java对象
我有一个Json字符串,它有一个字符串消息字段。 字符串: 我想将其转换为以下结构: Notification.javaJackson将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对象?我希望
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
}
}