2

私は車輪の作成を楽しむ Web サービスを使用しています。オブジェクトのシーケンスの場合、JSON 配列内にデータを格納する代わりに、シーケンスのインデックスごとに新しいノードを作成します。

{
    "sequence": {
        "0": {
            "foo": "foo",
            "bar": "bar",
            "baz": "baz"
        },
        "1": {
            "foo": "foo",
            "bar": "bar",
            "baz": "baz"
        },
        "2": {
            "foo": "foo",
            "bar": "bar",
            "baz": "baz"
        }
    }
}

これをjacksonを使用してシーケンスBeanの配列またはコレクションに逆シリアル化するためのエレガントなソリューションまたは正気のアプローチを誰かが持っているかどうか疑問に思っていました

public class SequenceElement {
    String foo, bar, baz;
    // Getters and setters below
} 

JsonNode としてシーケンスを操作することは、atm で思いつくことができる最善の方法です。ここに、テストされていない sudo コードがあります。

ObjectMapper objectMapper = new ObjectMapper();    

@JsonProperty("sequence")
public void setSequence(JsonNode sequence) {
    List<SequenceElement> list = new ArrayList<SequenceElement>();

    int i = 0;
    while( sequence.get( String.valueOf(i) ) != null ) {
        JsonNode element = sequence.get( String.valueOf(i) );
        list.add( objectMapper.readValue( element, SequenceElement.class );
        i += 1;
    }

    this.sequence = list;
}
4

2 に答える 2

3

IMOMap<String,Sequence>は、JSON オブジェクトと同等の Java である必要があります。

于 2013-05-29T16:54:38.533 に答える
2

@SubirKumarSaoのすでに正しい答えを拡張するために、データインデックスによって保証されるのと同じ順序で、シーケンスアイテムをリストとして取得する方法を次に示します。

データクラス:

public class Sequence {
    private String foo;
    private String bar;
    private String baz;

    // Constructors, getters/setters

    @Override
    public String toString() {
        return String.format("Sequence[foo=%s, bar=%s, baz=%s]", getFoo(),
                getBar(), getBaz());
    }
}

class SequenceHolder {
    private Map<Integer, Sequence> sequence;

    public SequenceHolder() {
        sequence = new TreeMap<Integer, Sequence>();
    }

    // Other constructors, getters/setters
}

主なロジック:

final String json = "JSON HERE";

final SequenceHolder holder = new ObjectMapper().readValue(json,
        SequenceHolder.class);
System.out.println(holder.getSequence().values());

この変更されたバージョンの JSON でテストされました (順序を説明するため):

{
    "sequence": {
        "0": {
            "foo": "foo0",
            "bar": "bar0",
            "baz": "baz0"
        },
        "1": {
            "foo": "foo1",
            "bar": "bar1",
            "baz": "baz1"
        },
        "2": {
            "foo": "foo2",
            "bar": "bar2",
            "baz": "baz2"
        }
    }
}

出力:

[シーケンス[foo=foo0, bar=bar0, baz=baz0], シーケンス[foo=foo1, bar=bar1, baz=baz1], シーケンス[foo=foo2, bar=bar2, baz=baz2]]

ご覧のとおり、データ インデックスによって保証されているのと同じ順序で項目のリストを取得します (キーはツリー マップの使用です)。

于 2013-05-29T20:04:15.933 に答える