如何避免gson tojson递归

时间:2016-01-27 07:38:01

标签: java json gson

我的课程非常简单:

MyObject:
 - String index;
 - MyObject parent;
 - List<MyObject> childs;

我想将存储的信息打印到json中。我使用Gson库的json函数。但由于每个孩子都有一个父对象的链接,我面对无限循环递归。有没有办法定义gson只打印每个子节点的父索引而不是转储完整信息?

2 个答案:

答案 0 :(得分:4)

您需要使用@Expose注释。

Cursor webLinksCursor = ctx.getContentResolver().query(Browser.BOOKMARKS_URI, Browser.HISTORY_PROJECTION, null, null, Browser.BookmarkColumns.DATE + " DESC");
    int row_count = webLinksCursor.getCount();

    int title_column_index = webLinksCursor.getColumnIndexOrThrow(Browser.BookmarkColumns.TITLE);
    int url_column_index = webLinksCursor.getColumnIndexOrThrow(Browser.BookmarkColumns.URL);

    if ((title_column_index > -1) && (url_column_index > -1) && (row_count > 0))
    {
        webLinksCursor.moveToFirst();
        while (webLinksCursor.isAfterLast() == false)
        {
            if (webLinksCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX) != 1)
            {
                if (!webLinksCursor.isNull(url_column_index))
                {
                    return webLinksCursor.getString(url_column_index);
                }
            }
            webLinksCursor.moveToNext();
        }
    }
    webLinksCursor.close();
    return null;

然后使用

生成json
public class MyObject{

    @Expose
    String index;

    MyObject parent;

    @Expose
    List<MyObject> children;

}

编辑: 将它转换回对象时,可以执行dfs解析。只需制作一个方法:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
jsonString = gson.toJson(data);

并将其称为根对象。

答案 1 :(得分:1)

我今天遇到了同样的问题,并找到了另一个我想分享的解决方案:

您可以将属性声明为transient,但不会将其序列化或反序列化:

public class MyObject{
  String index;
  transient MyObject parent;
  List<MyObject> children;
}
Gson gson = new Gson();
gson.toJson(obj); // parent will not show up