-5

映射/反序列化此 json 的最佳解决方案是什么:

 { "columns" : [ "name", "description", "id" ], "data" : [ [ "Train", "Train desc", 36 ], [ "Ship", "Ship desc", 35 ], [ "Plane", "Plane desc", 34 ] ] } 

在这个类的对象列表中:

class Transport { String id; String name; String description; }
4

1 回答 1

1

我不知道支持 JSON 数组(“数据”是数组数组)和 Java 对象字段之间映射的库。

gson库允许您将 JSON 数组映射到 java 字符串数组的数组,但是您必须将其转换为您的对象模型你可以将你的 JSON 解析成这个对象:

class DataWrapper
{
    String[] columns;
    String[][] data;
}

另一种解决方案是使用 JSonReader 并使用此类流出您的对象:

import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;

import com.google.gson.stream.JsonReader;

public class TransportJSonReader implements Iterator<Transport> {

protected JsonReader jsonReader;

public TransportJSonReader(Reader reader) throws IOException
{
    jsonReader = new JsonReader(reader);
    jsonReader.beginObject();

    //columns
    jsonReader.nextName();
    jsonReader.skipValue();

    //data
    jsonReader.nextName();
    jsonReader.beginArray();

}

@Override
public boolean hasNext() {
    try {
        return jsonReader.hasNext();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

@Override
public Transport next() {
    if (!hasNext()) throw new IllegalStateException();

    try {
        jsonReader.beginArray();
        String name = jsonReader.nextString();
        String description = jsonReader.nextString();
        String id = jsonReader.nextString();
        jsonReader.endArray();
        return new Transport(id, name, description);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

@Override
public void remove() {
    throw new UnsupportedOperationException();
}

}

它是一个迭代器,因此您可以通过以下方式使用它:

    TransportJSonReader reader = new TransportJSonReader(new StringReader(json));
    while(reader.hasNext()) System.out.println(reader.next());
于 2013-07-10T19:00:17.150 回答