java - 序列化字符串而不转义 "to\"

标签 java json serialization gson

我想为我的 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 文本的字符串值而不转义它,您可以使用 @JsonAdapterjsonValue(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/

相关文章:

java - 如何删除 Jackson 自定义序列化程序生成的空值?

serialization - 如果应用程序从不依赖其对象标识,是否可以序列化基于值的对象?

java - PlayFramework 2 模板测试

json - go json marshal 的默认大小写选项?

json - NU1001 无法解析依赖项 Microsoft...>=1.0.0

jQuery ajax 请求使用 jsonp 错误

java - 具有 spark 序列化问题的功能接口(interface)

java - 如何在liferay中制作友好的url

java - GridBagLayout,在 JButtons 之间添加空间

java - ibm狂想曲汇编