0

この JSON 出力を Java クラスにシリアライズ/デシリアライズする方法を見つけるのに苦労していますか? 誰でもコードサンプルを提供できますか?

[
    {
        "topic": "this is my topic"
    },
    [
        {
            "name": "John"
        },
        {
            "age": 100
        }
    ]
]

私の現在の試みは、このJavabeanを使用しています:

public class Test {
    private String topic;
    private List<Person> listOfPersons;
}

Gsonを使用してデータを逆シリアル化しようとしています:

gson.fromJson(this.json, Test[].class);

しかし、Gson は JSON で人物のリストを探していますが、リストが存在しないため、逆シリアル化は失敗します。

4

2 に答える 2

0

ここでの問題は、JSONデータは構文的には正しいが、意味的にはあいまいであるということです。つまり、配列内の各項目が異なるタイプであるポリモーフィック配列を表しているように見えます。

さらに、「人」を表す部分はひどく非正規化されているようで、人の各属性は配列内の個別のオブジェクトとして表されます。確かにかなり奇妙です。残念ながら、データだけを見ただけでどのタイプが表されているかを判断することは本当に不可能であり、Gsonがデータを逆シリアル化できるようにするためのヒントは提供されていません。この場合にできる最善のことは、情報を手動で解析することです。

Test test = new Test();
JsonArray rootArray = new JsonParser().parse(jsonString);
test.setTopic(rootArray.get(0).get("topic");

Person person = new Person();
JsonArray personArray = rootArray.get(1);
person.setName(personArray.get(0).get("name"));
person.setAge(personArray.get(1).get("age"));

test.setListOfPersons(Arrays.asList(person));
于 2013-03-08T05:02:09.460 に答える
0

配列の隣、配列内にオブジェクトを配置することは理にかなっているようには見えません。物事を次のように表現するのは理にかなっています:

{
    "topic": "this is my topic",
    "listOfPersons" : [
        {
            "name": "John",
            "age": 100
        },
        {
            ... another person
        }
    ]
}

Person次に、クラスを持つことができます:

public class Person {
    private String name;
    private int age;
}

...そして、既に持っているコードで逆シリアル化できます。

于 2013-03-08T04:55:38.450 に答える