如何使用Gson仅使用值反序列化嵌套数组json?

时间:2013-02-04 14:49:06

标签: arrays json nested gson

输入json是:

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

我从服务器收到此消息。服务器告诉我结果和播放器列表。每个玩家都有一个唯一的ID,以及几个联系地址,也许就是那个(ip +端口)。对我来说困难的部分是数组中的项只有值。它不像字符串:值。

有人能告诉我如何用gson反序列化吗?

提前致谢。

1 个答案:

答案 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

中的