4

私は次のPOJOを持っています:

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

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

私のコードでは、 Java JSONList<List<Widget>>ライブラリを使用して 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 ではない可能性があることです。この 2 番目の (目的の) JSON スニペットをjsonlint.orgに貼り付けると、パーサー エラーが発生します。

最初に、私が望む JSONが適切であるためにはどのように見えるべきかを誰かが指摘してくれるかどうかを尋ねています。次に、Java JSON または GSON のいずれかが目的の出力を生成できるように、誰かが私のリストをマッサージするのを手伝ってくれないかどうか。widgetGroups前もって感謝します!

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には、暗黙的に順序付けられているが名前が付けられていない配列と、必ずしも順序付けられていないが名前付きのキーと値のペアを持つオブジェクト(または連想配列)の2種類の「コンテナー」しかありません。正しいJSON構文は次のとおりです。

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

「widgetGroup」リスト内に配列を配置したことに注意してください。名前をあきらめて単純な配列([]構文)を配置するか、オブジェクト({}構文)使用して一意の名前を使用する必要があります(つまり、 「ウィジェット」という名前の2つの同一の要素があります)

GSON(または他の一般的なjava-jsonトランスフォーマー)からこれを取得する構文については、連想配列が必要なリストの代わりにマップを使用してください。

編集:私は以前にJSON-Javaを使用したことがありませんが、仕様を見ると、連想配列を挿入するにはJSONObjectクラスが必要なようです。

于 2013-03-04T21:01:43.097 に答える