【发布时间】:2015-08-28 12:10:05
【问题描述】:
我有一个 json 字符串,看起来像这样:
{"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
当我使用 gson 解析器将其转换为 Map<String,String> map 时。 gson 将类型转换为Map<String,ArrayList>。当我尝试使用System.out.println(map.get("employees").getClass().toString()) 打印类名时。但这会引发异常 - java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String。
我的代码看起来像这样
String npv = json_string_provided_above;
Map<String,String> mp = new HashMap<String, String>();
mp = new Gson().fromJson(npv,mp.getClass());
System.out.println(mp.get("employees").getClass().toString());
json 由用户以字符串格式作为输入提供(并且它始终是有效的 json 字符串)。有一件事是肯定的,我不能假设任何关于数据类型的事情。因为它将由用户提供。
所以现在我实际上想要这样,即使用户输入了字符串数组或对象数组之类的东西。它不应该将它们转换为列表,
有没有一种方法可以硬编码类型并将它们保存在Map<String,String> 中。所以在上面的例子中,当我做map.get("employees") 它应该给我[{"firstName":"John", "lastName":"Doe"},{"firstName":"Anna", "lastName":"Smith"},{"firstName":"Peter", "lastName":"Jones"}] 作为字符串而不是列表。我不知道该怎么做。
感谢您的帮助,
【问题讨论】:
-
“当我使用 gson 解析器将其转换为 Map
映射时。”为什么要这么做?你没有有字符串到字符串的映射——你实际上有一个 Map<String, Object>,其中employees的值是一个列表......你为什么期望 GSON将 JSON 中的自然列表转换为字符串? -
@JonSkeet,实际上还有一个 for 循环遍历所有
map Entry并尝试将它们打印给用户。如果那是对象,我无法猜测该对象的任何信息(如果可以,那么要打印,我必须自己检查并深入到 json 中并一一打印,这看起来像 dfs)。假设数据类似于{k1:A1,k2:A2,k3:S1},其中 k1,k2,k3,S1 是字符串,A1,A2 是数组。我不在乎用户在这些数组中输入了什么,只需将数据保留为String。因此,在打印时,我可以通过遍历地图的所有条目来打印数据。感谢您的帮助。 -
所以将其设为
Map<String, Object>,然后在值上调用toString()。但不要指望 GSON 解析器会为您丢失这些信息...... -
@JonSkeet,非常感谢。那行得通。