我有一个像这样的Java地图:
HashMap<String, String> map = new HashMap<String, String>();
map.put("someKey", jsonStringVariable);
map.put("someOtherKey", jsonStringVariable2);
其中jsonStringVariable
和jsonStringvariable2
是具有有效JSON的字符串。
最终,我想使用Gson将整个地图设为一个JSON字符串,目前这样做:
Gson gson = new Gson();
String json = gson.toJson(map);
但是,现在json
在地图中为原始JSON字符串添加了大量反斜杠。如何防止Gson向我的原始JSON变量添加斜杠并将它们保留为JSON?
答案 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
的解决方案的弱点可能是:
Object.class
时,不会在幕后获取未预期的类型适配器; 在这种情况下,您可以使用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
; Gson
实例配置如何; 例如,如果您有someValue
和someOtherValue
,请执行以下操作:
[
"foo", "bar"
]
{
"foo": 1,
"bar": 2
}
输出如下:
{"someKey":[
"foo", "bar"
]
,"someOtherKey":{
"foo": 1,
"bar": 2
}
}
如果您需要对值进行规范化(没有空格,新行等),您只需通过JsonReader
读取每个JSON值,并将其传入结果委托给JsonWriter
实例反射(得到BEGIN_OBJECT
? - 使用.beginObject
等写作。)