输入json是:
{
"players":
[
[
[
"192.168.1.0",
"8888"
],
"id_1"
],
[
[
"192.168.1.1",
"9999"
],
"id_2"
]
],
"result":"ok"
}
我从服务器收到此消息。服务器告诉我结果和播放器列表。每个玩家都有一个唯一的ID,以及几个联系地址,也许就是那个(ip +端口)。对我来说困难的部分是数组中的项只有值。它不像字符串:值。
有人能告诉我如何用gson反序列化吗?
提前致谢。
答案 0 :(得分:1)
players
中的内容是Map
,表示为JSON数组。
这是一张丑陋的地图,但它仍然是Map
。关键是List<String>
(IP和端口),其值为String
(“id”)
这几乎就像曾经写过服务器的人犯了一个错误并向后做了,特别是考虑到你对这个所谓的描述。它应该看起来像:
[“id_1”,[[“192.168.1.0”,“8888”],[另一个IP /端口],...]
每个条目。这会更有意义,因为(String
)“id”是关键,List<List<String>>
是值。
这仍然很丑,因为他们真的应该使用对象来表示IP /端口。理想情况下你会想要:
[“id_1”,[{“ip”:“192.168.1.1”,“port”:“8888”},{“ip”:“192.168.1.2”,“port”:“8889”}]]
下面演示了它目前的编写方式:
public static void main( String[] args )
{
String json = "{\"players\":[[[\"192.168.1.0\",\"8888\"],\"id_1\"],[[\"192.168.1.1\",\"9999\"],\"id_2\"]],\"result\":\"ok\"}";
Gson gson = new GsonBuilder().create();
MyClass c = gson.fromJson(json, MyClass.class);
c.listPlayers();
}
class MyClass
{
public String result;
public Map<List<String>, String> players;
public void listPlayers()
{
for (Map.Entry<List<String>, String> e : players.entrySet())
{
System.out.println(e.getValue());
for (String s : e.getKey())
{
System.out.println(s);
}
}
}
}
输出:
ID_1
192.168.1.0
8888
ID_2
192.168.1.1
9999
您可以获得一些创意,并使地图的关键点更加实用:
class IpAndPort extends ArrayList<String> {
public String getIp() {
return this.get(0);
}
public String getPort() {
return this.get(1);
}
}
然后改变:
public Map<List<String>, String> players;
为:
public Map<IpAndPort, String> players;
MyClass
中的