1

私はプロトスタッフを使用してjsonをデシリアライズしようとしていますが、オブジェクトをシリアライズすると、配列のサイズが前に置かれます

{"id":1,"price":1.2,"name":"alex","tags":{"a":3,"b":["tag1","tag2","tag2"]}}

同じ文字列をデシリアライズしようとすると、それは魅力のように機能しますが、私のデータには "a":3,"b": というタグはありません。

{"id":1,"price":1.2,"name":"alex","tags":["tag1","tag2","tag2"]}

上記のような文字列をデシリアライズしようとすると、例外がスローされます

 io.protostuff.JsonInputException: Expected token: { but was VALUE_STRING on tags of message java.lang.reflect.Array

使用される Java コード:

String[] x = {"tag1", "tag2", "tag2"};
Product t = new Product(1, 1.2, "alex", x);
Path path = Paths.get("...");
byte[] as = Files.readAllBytes(path);
io.protostuff.Schema<Product> schema = RuntimeSchema.getSchema(Product.class);
LinkedBuffer buffer = LinkedBuffer.allocate(512);

byte[] protostuff;
try {
    protostuff = JsonIOUtil.toByteArray(t, schema, false , buffer);
} finally {
    buffer.clear();
}
// deser
Product f = schema.newMessage();
JsonIOUtil.mergeFrom(as, f, schema,false);

製品クラス:

public class Product {
    private int id;
    private double price;
    private String name;
    private String[] tags;

    public Product(int id, double price, String name, String[] tags) {
        this.id = id;
        this.price = price;
        this.name = name;
        this.tags = tags;
    }

    public Product() {
    }



    public int getId() {
        return id;
    }

    public double getPrice() {
        return price;
    }

    public String getName() {
        return name;
    }

    public String[] getTags() {
        return tags;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setTags(String[] tags) {
        this.tags = tags;
    }

    @Override
    public String toString() {
        return name+" "+ price+" "+ id+" "+ Arrays.toString(tags);
    }    
}
4

1 に答える 1

0

Protostuff は、配列をシリアル化するために特別なスキーマを使用します。パフォーマンス上の理由から、配列サイズをシリアル化された形式にします。

フィールド タイプtagsを Listに変更する必要があります。

private List<String> tags;

リストは JSON 配列に直接シリアライズされます。

{"id":1,"price":1.2,"name":"alex","tags":["tag1","tag2","tag2"]}
于 2015-06-06T05:43:05.637 に答える