我想为我的 Restful Web 服务导出 json 字符串。
我的类(class)看起来像:
public class Animal {
private String name;
private JsonElement additionalProperties; //generated with gson
private String additionalProperties2; //same as above but direct from db
}
additionalProperties 是数据库中的 Json 字段,并以字符串形式返回到 Java。想法是,每种动物都可以有其特殊的属性和任何类型的数据结构,而不需要在 Java 端对其进行建模。
当我尝试导出时,这是使用 gson。
List<Animal> animals = database.getAllAnimals(); //simplified
return gson.toJson(animals); // in real via javax.ws.rs.core.Response
我的问题是输出看起来像:
[
{"name": "Mia",
"additionalProperties: "{\"race\": \"dog\"}",
"additionalProperties2: "{\"race\": \"dog\"}"},
{...} ...
]
相反,我想要:
[
{"name": "Mia",
"additionalProperties: {"race": "dog"}"
{...} ...
]
我已经尝试在没有附加属性的情况下构建 JsonObjects 并使用“添加属性”来添加附加属性。但输出是一样的。我猜问题是Java字符串序列化。 DB输出正确。 extraProperties 是一个普通的字符串,没有编码“。
我看到了 jackson 的属性(property)@JsonRawValue。这是如何运作的?我也可以用 gson 来做这个吗?
最佳答案
首先,你的JsonElement
应该可以正常工作,所以也许你创建它的方式是错误的。
其次,要输出包含 JSON 文本的字符串值而不转义它,您可以使用 @JsonAdapter
和 jsonValue(String value)
:
Writes
value
directly to the writer without quoting or escaping.
显示两者的示例代码:
public class Test {
public static void main(String[] args) throws Exception {
String jsonTextFromDb = "{\"race\": \"dog\"}";
JsonElement additionalProperties = new JsonParser().parse(jsonTextFromDb);
Animal animal = new Animal("Mia", additionalProperties, jsonTextFromDb);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(animal));
}
}
class Animal {
private String name;
private JsonElement additionalProperties;
@JsonAdapter(JsonTextAdapter.class)
private String additionalProperties2;
Animal(String name, JsonElement additionalProperties, String additionalProperties2) {
this.name = name;
this.additionalProperties = additionalProperties;
this.additionalProperties2 = additionalProperties2;
}
}
class JsonTextAdapter extends TypeAdapter<String> {
@Override
public void write(JsonWriter out, String str) throws IOException {
out.jsonValue(str);
}
@Override
public String read(JsonReader in) throws IOException {
return new JsonParser().parse(in).toString();
}
}
输出
{
"name": "Mia",
"additionalProperties": {
"race": "dog"
},
"additionalProperties2": {"race": "dog"}
}
关于java - 序列化字符串而不转义 "to\",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213694/