4

输入的json是:

{
    "players":
    [
        [
            [
              "192.168.1.0",
              "8888"
            ],
            "id_1"
        ],            
        [
            [
              "192.168.1.1",
              "9999"
            ],
            "id_2"
        ]
    ],
    "result":"ok"
}

我从服务器收到此消息。服务器告诉我结果和玩家名单。每个玩家都有一个唯一的 id 和几个联系地址,可能不止一个(ip+port)。对我来说困难的部分是数组中的项目只有价值。它不像字符串:值。

谁能告诉我如何用 gson 反序列化它?

提前致谢。

4

1 回答 1

2

你所拥有的players是一个Map表示为 JSON 数组。

这是一张丑陋的地图,但它仍然是Map. 键是List<String>(IP 和端口),值为 a 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

于 2013-02-04T17:36:19.307 回答