问题描述
嗨,我有一个像这样的课程:
public class A {
String x;
String y;
String data;
}
变量x和y包含普通字符串,但变量数据包含JSON字符串,即'
x = "aaaa";
y = "bbbb";
data = "{\"key\":\"val\"}";
我要转换JSON中的完整对象,以使最终输出为:
{
x : "aaaa",y : "bbbb",data : {
"key" : "val"
}
}
我尝试使用new JSONObject(object)
将对象转换为JSON。它对x
和y
属性确实很好,但是data
仍然是这样的字符串:
data : "{\\\"key\\\":\\\"value\\\"}"
。我也想一口气将data
进行JSON化。
如何实现?
解决方法
最简单的方法是让您的data
字段成为另一个对象。
public class Data {
String key;
String val;
}
和您的班级中
public class A { //Java classes start with uppercase
String x;
String y;
Data data;
}
,
如果您不想修改该类或创建从其扩展的新类,则可以删除不必要的字符:
public class Main {
public static void main(String[] args) {
a obj = new a();
obj.x = "aaaa";
obj.y = "bbbb";
obj.data = "{\"key\":\"val\"}";
String str = new JSONObject(obj).toString().replaceAll("\\\\","")
.replaceAll("\"\\{","{")
.replaceAll("\\}\"","}");
System.out.println(str);
}
}
输出:
{"data":{"key":"val"},"x":"aaaa","y":"bbbb"}
或者您可以使用org.apache.commons.text.StringEscapeUtils.unescapeJson
轻松地完成工作。
鉴于OP对Doga Oruc的回答,这里是一种解决方法:从成员Data中读取您的String并使用Map<String,Object>
类将该JSON字符串解析为JsonObject
。然后将类A解析为JSON,然后解析回Map<String,Object>
。在第二张地图中,用第一张地图的值替换键“数据”。这显然很麻烦,但这就是无法修改原始课程的代价
杰克逊这样的事情怎么样?
class AWrapper {
String x;
String y;
Object data;
public AWrapper(A a,ObjectMapper mapper) throws IOException {
this.x = a.x;
this.y = a.y;
this.data = mapper.readValue(a.data,Object.class);
}
public String getX() {
return x;
}
public String getY() {
return y;
}
public Object getData() {
return data;
}
}
class SomeClass {
public static String toJson(A a) throws IOException {
ObjectMapper mapper = new ObjectMapper();
AWrapper aWrapper = new AWrapper(a,mapper);
return mapper.writeValueAsString(aWrapper);
}
}