10

Gsonを使用してjson配列を逆シリアル化する方法については、stackoverflowに多くの情報があります。

しかし、どうすればXStreamjettisonで同じことを行うことができますか?

これがjsonです:

{"entity":[{"id":"1", "name":"aaa"}, {"id":"2", "name":"bbb"}]}

これが私がXStreamそれを解析しようとする方法のコードです:

XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.alias("entity", Entity[].class);
return (Entity[])xstream.fromXML(jsonString);

次の例外があります:

com.thoughtworks.xstream.converters.ConversionException: id : id
4

2 に答える 2

0

ルート要素に関連するこの回答 からわかるように、JSONにルート要素がない場合、XStreamは失敗します。

エンティティを特定のJavaクラスにマップすると、XStreamはidnameのペアのルート要素を見つけることができません(JSONの場合のように、それらは要素で囲まれていません)。

ここで役立つのは、手作りのラッパー、入力ストリームの操作、またはカスタムコンバーターの使用のみです。

于 2015-11-11T10:08:17.237 に答える
0

配列では実行できませんが、リストでは次のようになります。

Java:

package de.mosst.spielwiese;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

import lombok.Data;

public class XStreamDeserializeJsonWithJettison {

    @Test
    @SuppressWarnings("unchecked")
    public void smokeTest() {
        InputStream file = XStreamDeserializeJsonWithJettison.class.getResourceAsStream("XStreamDeserializeJsonWithJettison.json");
        XStream xStream = new XStream(new JettisonMappedXmlDriver());
        xStream.processAnnotations(Entity.class);

        List<Entity> entities = (List<Entity>) xStream.fromXML(file);
        System.out.println(entities);
    }

    @Data
    @lombok.AllArgsConstructor
    @XStreamAlias("entity")
    class Entity {
        String id;
        String name;
    }
}

XML:

{
    "list": [
        {
            "entity": [
                {
                    "id": 1,
                    "name": "odin"
                },
                {
                    "id": 2,
                    "name": "dwa"
                }
            ]
        }
    ]
}
于 2017-07-10T16:54:05.177 に答える