我想为我的restful webservice导出一个json String。
我的班级看起来像:
public class Animal {
private String name;
private JsonElement additionalProperties; //generated with gson
private String additionalProperties2; //same as above but direct from db
}
additionalProperties是db中的Json字段,并作为String返回给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"}"
{...} ...
]
我已经尝试在没有additionalProperties的情况下构建JsonObjects并使用&#34;添加属性&#34;添加其他属性。但输出是一样的。我想问题是Java String serializen。 DB输出正确。 additionalProperties是一个普通的String,没有&#34;。
的编码我看到了Jacksons的财产@JsonRawValue。这是如何运作的?我可以用gson做这个吗?
答案 0 :(得分:2)
首先,你的JsonElement
应该可以正常工作,所以也许你用错误的方式创建它。
其次,要输出包含JSON文本的String值而不转义它,您可以使用@JsonAdapter
和jsonValue(String value)
:
将
value
直接写入作者而不引用或转义。
显示两者的示例代码:
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"}
}