json:使用gson库时发生反序列化错误

wnavrhmk  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(524)

我有一个json字符串,应该转换回Map类型。
使用的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>"
 }"

将json转换为map的代码:

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

wpcxdonn1#

必须对限定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");
    }
gv8xihay

gv8xihay2#

当你使用 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>}

相关问题