Json / gson(de)序列化嵌套对象

时间:2012-07-24 20:46:23

标签: json nested deserialization gson

有关如何使用gson处理这种json结构的任何想法,或其他lib如果更适应

[{
    "name": "john",
    "link": []
}, {
    "name": "mike",
    "link": [{
        "name": "kate",
        "link": []
    }, {
        "name": "john",
        "link": []
    }]
}, {
    "name": "jane",
    "link": [{
        "name": "tyler",
        "link": [{
            "name": "evan",
            "link": []
        }]
    }]
}]

对象列表(名称,链接),链接这些对象的同一种列表
所以有可变的深度

3 个答案:

答案 0 :(得分:1)

JSON结构非常适合多维数组或多维列表列表。用Gson对它进行反序列化相对简单。

import java.io.FileReader;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public class GsonFoo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new GsonBuilder().create();

    // Deserialized as a multidimensional array:
    BarsArray[] barsArray = gson.fromJson(new FileReader("input.json"), BarsArray[].class);
    System.out.println(gson.toJson(barsArray));

    // Deserialized as a multidimensional list of lists:
    List<BarsList> barsList = gson.fromJson(new FileReader("input.json"), new TypeToken<List<BarsList>>(){}.getType());
    System.out.println(gson.toJson(barsList));
  }
}

class BarsArray
{
  String name;
  BarsArray[] link;
}

class BarsList
{
  String name;
  List<BarsList> link;
}

答案 1 :(得分:1)

Hmmh。明显的对象定义有什么问题:

public class Node {
    public String name;
    public Node[] link; // or List<Node>
}

然后使用GSON或其他数据绑定库(如Jackson)绑定Node[]List<Node>

答案 2 :(得分:0)

您可以使用GSON raw collections api手动解析json。这应该是直截了当的,因为你的结构非常规律。有关示例,请参阅here