我有一个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对象?我想避免反序列化两次。
答案 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");