2017-04-16 241 views
1

我有一個Java地圖是這樣的:GSON被添加斜線到我的JSON字符串

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?

+0

解組這兩個JSON字符串,將結果添加到地圖並序列化地圖。 –

+1

您將一個JSON文檔放在另一個文本中(作爲文本)。而是將它們結合到單個文檔中。 – ThomasRS

回答

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); 

我不知道這是否是有效的,但在至少現在它工作。如果有人知道更有效的方法,請讓我知道!

+0

是的,我也試過..工作正常。因爲最後你需要提供對象給Gson而不是String .. –

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等寫入)。