2013-03-04 74 views
4

我有以下POJO:如何强制Java JSON或GSON明确命名我数组和对象

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

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

在我的代码,我试图使用Java JSONList<List<Widget>>转换成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或GSON可以产生所需的输出。提前致谢!

回答

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()在地图上。

0

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

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

你应该注意的是,“widgetGroup”名单里面我把一个数组 - 你要么必须放弃的名字,并提出了一个简单的数组([]语法),或一个对象({}语法)使用唯一的名称(即你不能有两个相同的元素命名为“小部件”)

至于语法从GSON(或其他常见的Java的JSON得到这个变形金刚)使用地图,而不是你想要一个关联数组的列表。

编辑:我以前没有使用JSON-Java的工作,但在寻找的规格看来你需要的的JSONObject类插入关联数组。

相关问题