Gson正在为我的JSON字符串添加斜杠

时间:2017-04-16 16:00:04

标签: java gson

我有一个像这样的Java地图:

HashMap<String, String> map = new HashMap<String, String>();
map.put("someKey", jsonStringVariable);
map.put("someOtherKey", jsonStringVariable2);

其中jsonStringVariablejsonStringvariable2是具有有效JSON的字符串。

最终,我想使用Gson将整个地图设为一个JSON字符串,目前这样做:

Gson gson = new Gson();
String json = gson.toJson(map);

但是,现在json在地图中为原始JSON字符串添加了大量反斜杠。如何防止Gson向我的原始JSON变量添加斜杠并将它们保留为JSON?

2 个答案:

答案 0 :(得分:0)

我找到了一个自己的解决方案,首先将JSON字符串转换为对象,然后将其转换回字符串:

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("someKey", gson.fromJson(jsonStringVariable, Object.class);
map.put("someOtherKey", gson.fromJson(jsonStringVariable2, Object.class);

我不确定这是否有效,但至少现在它有效。如果有人知道更有效的方法,请告诉我!

答案 1 :(得分:0)

这是因为必须对字符串进行编码并正确转义,以保持结果JSON文档的语法正确。

  

我不确定这是否有效,但至少现在它有效。如果有人知道更有效的方法,请告诉我!

基于gson.fromJson的解决方案的弱点可能是:

  • ...本身相对不太便宜(查找类型适配器,Java反射等);
  • ...在将所有内容视为Object.class时,不会在幕后获取未预期的类型适配器;
  • ...消耗(多)内存以保存应该被写回的反序列化值;
  • ...返回与输入JSON表示不匹配的JSON表示。

在这种情况下,您可以使用JsonWriter

final Writer writer = new StringWriter();
// ...
try ( final JsonWriter jsonWriter = new JsonWriter(writer) ) {
    jsonWriter.beginObject();
    jsonWriter.name("someKey");
    jsonWriter.jsonValue(someValue);
    jsonWriter.name("someOtherKey");
    jsonWriter.jsonValue(someOtherValue);
    jsonWriter.endObject();
}
// ...
return writer.toString();

请注意,您不一定要使用StringWriter:您可以将组合输出“重定向”到任何Writer实例。 所以使用它就像你得到的那样:

  • 根本不使用Gson;
  • 定义JSON结构,无论Gson实例配置如何;
  • 消耗最少的内存;
  • 确保按原样写入值。

例如,如果您有someValuesomeOtherValue,请执行以下操作:

[
    "foo", "bar"
]
{
    "foo": 1,
    "bar": 2
}

输出如下:

{"someKey":[
    "foo", "bar"
]
,"someOtherKey":{
    "foo": 1,
    "bar": 2
}
}

如果您需要对值进行规范化(没有空格,新行等),您只需通过JsonReader读取每个JSON值,并将其传入结果委托给JsonWriter实例反射(得到BEGIN_OBJECT? - 使用.beginObject等写作。)