【问题标题】:Json to java objects mapping [closed]Json 到 java 对象的映射[关闭]
【发布时间】:2013-07-08 19:32:53
【问题描述】:

映射/反序列化此 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; }

【问题讨论】:

  • 问题到底是什么?
  • @dougEfresh 问题是关于 JSON 直接映射到 java 的问题。
  • 你可以试试这个:json.org/java or code.google.com/p/google-gson
  • 无论您使用哪种解析器选择默认值。在其他一些语言中,选择是显而易见的,但 Java 对数组和“对象”有几种选择。

标签: java json deserialization


【解决方案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());

【讨论】:

  • 很好的解决方案,谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2010-11-28
  • 2017-02-28
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多