2013-06-06 20 views
1

我有應該轉換回Map類型的json字符串。Json:使用Gson庫時的反序列化錯誤

的Json使用:即轉換JSON

String jsonString = "{ 
    "varA": "<math><mrow><mn>8</mn></mrow></math>", 
    "varB": "<math><mrow><mi>m</mi></mrow></math>", 
    "ans": "<math><mrow><mn>8</mn><mo>&#8290;</mo><mi>m</mi></mrow></math>" 
}" 

守則地圖:

Map<String, String> variableMap = gson.fromJson(jsonString, new TypeToken<Map<String,String>>(){}.getType()); 

錯誤:

[ERROR] The JsonDeserializer StringTypeAdapter failed to deserialize json object {"varA":"<math><mrow><mn>8</mn></mrow></math>","varB":"<math><mrow><mi>m</mi></mrow></math>","ans":"<math><mrow><mn>8</mn><mo>&#8290;</mo><mi>m</mi></mrow></math>"} given the type class java.lang.String 

我知道它有什麼做的類型,但我已經表明類型標記中顯式的類型將是String。

的GSON對象聲明如下:

Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 
+0

解串可能是不喜歡有特殊字符< and >。您可能需要對它們進行編碼,我猜... – Vishwanath

回答

1

你必須逃脫界定包含在Java字符串中的JSON字符串值引號。事實上,您的示例不是有效的Java程序 - 對於初學者,Java缺少多行字符串。

下面的代碼片段運行良好(尖括號和Unicode字符變成是無害的):

public static void main(String[] args) { 
     String jsonString = "{\"varA\": \"<math><mrow><mn>8</mn></mrow></math>\", \"varB\": \"<math><mrow><mi>m</mi></mrow></math>\", \"ans\": \"<math><mrow><mn>8</mn><mo>&#8290;</mo><mi>m</mi></mrow></math>\"}"; 
     Map<String, String> variableMap = new Gson().fromJson(jsonString, new TypeToken<Map<String,String>>(){}.getType()); 
     System.out.println("foo"); 
    } 
+0

(您可以替換用於'new GsonBuilder()。disableHtmlEscaping()。create()'的普通Gson實例) – vemv

0

當您使用Map.class,而不是新的TypeToken<Map<String,String>>(){}.getType()這是工作。看到我的小例子:

Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 

Map<String, String> map = new HashMap<String, String>(); 
map.put("varA", "<math><mrow><mn>8</mn></mrow></math>"); 
map.put("varB", "<math><mrow><mi>m</mi></mrow></math>"); 
map.put("ans", "<math><mrow><mn>8</mn><mo>&#8290;</mo><mi>m</mi></mrow></math>"); 

String json = gson.toJson(map); 

System.out.println(json); 
System.out.println(gson.fromJson(json, Map.class)); 

它打印:

{ 
    "varB":"<math><mrow><mi>m</mi></mrow></math>", 
    "ans":"<math><mrow><mn>8</mn><mo>&#8290;</mo><mi>m</mi></mrow></math>", 
    "varA":"<math><mrow><mn>8</mn></mrow></math>" 
} 

{varB=<math><mrow><mi>m</mi></mrow></math>, ans=<math><mrow><mn>8</mn><mo>&#8290;</mo><mi>m</mi></mrow></math>, varA=<math><mrow><mn>8</mn></mrow></math>}