2

我正在使用一个喜欢制作轮子的网络服务。对于一系列对象,它们不是将数据存储在 JSON 数组中,而是为序列的每个索引创建一个新节点。

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

我想知道是否有人有一个优雅的解决方案或理智的方法来将其反序列化为带有杰克逊的序列 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 回答