4

我有以下 POJO:

public class Widget {
    private String fizz;
    private String buzz;
    private String foo;

    // Getters and setters for all 3...
}

在我的代码中,我尝试List<List<Widget>>使用Java JSON库将 a 转换为 JSON(但是我也接受使用 GSON 的任何答案)。

这是我的代码:

// Returns a single List<Widget> with 2 Widgets in it...
List<List<Widget>> widgetGroups = getWidgetGroups();

String widgetGroupsAsJson = JSON.encode(widgetGroups);
System.out.println(widgetGroupsAsJson);

这打印:

[
    [
        {
            "fizz": "Yes",
            "buzz": "Never",
            "foo": "Always"
        },
        {
            "fizz": "Sometimes",
            "buzz": "Always",
            "foo": "Pending"
        }
    ]
]

而我希望 JSON 显示为:

"widgetGroups": [
    "widgetGroup": [
        "widget": {
            "fizz": "Yes",
            "buzz": "Never",
            "foo": "Always"
        },
        "widget": {
            "fizz": "Sometimes",
            "buzz": "Always",
            "foo": "Pending"
        }
    ]
]

换句话说,我希望所有列表以及每个列表都widget被“命名”。然而,我首先担心的是这可能不是正确的 JSON。当我将此第二个(所需的)JSON 片段粘贴到jsonlint.org 时,我得到一个解析器错误。

所以首先我问是否有人可以指出我想要的 JSON应该是什么样子才能正确;其次,如果有人可以帮助我整理我的列表widgetGroups,以便 Java JSON 或 GS​​ON 可以产生所需的输出。提前致谢!

4

2 回答 2

5

首先,你确定这是正确的吗?注释和代码不匹配。

// Returns a single List<Widget> with 2 Widgets in it...
List<List<Widget>> widgetGroups = getWidgetGroups();

其次,创建一个 WidgetGroup 类,它将充当单个 WidgetGroup 的容器。

public class WidgetGroup {

    private String name;
    private List<Widget> widgets;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Widget> getWidgets() {
        return widgets;
    }

    public void setWidgets(List<Widget> widgets) {
        this.widgets = widgets;
    }
}

这将是一个有效的 JSON 结构:

{
  "widgetGroups" : [
    {
      "widgetGroup": [
        "widget": {
          "fizz": "Yes",
          "buzz": "Never",
          "foo": "Always"
        },
        /*More widgets*/
      ]
    },
    /*More widget groups*/
  ]
}

像这样的东西应该工作:

Map<String, List<WidgetGroup>> widgetGroups = new HashMap<String, List<WidgetGroup>>();
WidgetGroup widgetGroup1 = getWidgetGroup(); // Just an assumption of one of your methods.
WidgetGroup widgetGroup2 = getWidgetGroup(); // Just an assumption of one of your methods.

List<WidgetGroup> widgetGroupList = new ArrayList<WidgetGroup>();
widgetGroupList.add(widgetGroup1);
widgetGroupList.add(widgetGroup2);

widgetGroups.put("widgetGroups", widgetGroupList);

然后你toJson()在地图上打电话。

于 2013-03-04T20:53:34.207 回答
0

在 JSON 中,只有两种类型的“容器”——数组,隐式排序但未命名,对象(或关联数组)不一定排序,但具有命名键值对。正确的 JSON 语法应该是:

{
  "widgetGroups": [
    {
      "widgetGroup": [
        {
            "fizz": "Yes",
            "buzz": "Never",
            "foo": "Always"
        },
        {
            "fizz": "Sometimes",
            "buzz": "Always",
            "foo": "Pending"
        }
      ]
    }
  ]
}

您应该注意,在“widgetGroup”列表中,我放置了一个数组 - 您必须放弃名称并放置一个简单的数组([]语法),或者一个对象({}语法)使用唯一名称(即您可以t 有两个相同的元素,名为“widget”)

至于从 GSON(或其他常见的 java-json 转换器)获取此内容的语法,请使用映射而不是您想要关联数组的列表。

编辑:我以前没有使用过 JSON-Java,但查看规范似乎需要JSONObject类来插入关联数组。

于 2013-03-04T21:01:43.097 回答