序列化字符串而不转义"到\"

时间:2017-05-27 06:24:14

标签: java json serialization gson

我想为我的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做这个吗?

1 个答案:

答案 0 :(得分:2)

首先,你的JsonElement应该可以正常工作,所以也许你用错误的方式创建它。

其次,要输出包含JSON文本的String值而不转义它,您可以使用@JsonAdapterjsonValue(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"}
}