1

我有以下字符串:

"[{\"type\":\"string\",\"value\":\"value1\",\"field\":\"label\"},
    {\"type\":\"string\",\"value\":\"value2\",\"field\":\"address_unique\"}]"

我想把它变成 java GSON JsonObject 数组/列表,以便调用类似的东西:

myJsonObjs[i].getAsJsonPrimitive("value").getAsString();

实现这一目标的最短路径是什么?我尝试像这样设置一个bean:

public static class Filter {
    @SerializedName("type")
    private String type;
    @SerializedName("value")
    private String value;
    @SerializedName("field")
    private String field;

    //getters, setters and ctor
}

但我找不到使用 JsonParser 或 Gson 将上面的字符串反序列化为该 bean 的数组/列表的方法。特别是我试过

Gson gson = new Gson();
gson.fromJson(json_string, Filter[].class);

json_string上面的字符串在哪里)但这给了我一个

IllegalStateException: Expected BEGIN_ARRAY but was STRING

感谢您的帮助!

4

4 回答 4

4

这是一种方法:

final String json = "[{\"type\":\"string\",\"value\":\"value1\",\"field\":\"label\"},{\"type\":\"string\",\"value\":\"value2\",\"field\":\"address_unique\"}]";
final JsonParser parser = new JsonParser();
final JsonElement rootElement = parser.parse(json);
final JsonArray values = rootElement.getAsJsonArray();
for (final JsonElement value : values) {
    final JsonObject obj = value.getAsJsonObject();
    final Filter filter = new Filter();
    filter.setType(obj.get("type"));
    filter.setValue(obj.get("value"));
    filter.setField(obj.get("field"));
}

这是一种更自动化的方式:

final String json = "[{\"type\":\"string\",\"value\":\"value1\",\"field\":\"label\"},{\"type\":\"string\",\"value\":\"value2\",\"field\":\"address_unique\"}]";
final TypeToken<List<Filter>> token = new TypeToken<List<Filter>>() {
};
final Gson gson = new Gson();
final List<Filter> values = gson.fromJson(json, token.getType());
于 2013-01-07T23:28:37.617 回答
1

你用解析尝试了什么?你有一个字符串,你需要两个步骤

  1. 将字符串解析为 JsonArray
  2. 使用 fromJson 将 JsonArray 转换为 java 对象
于 2013-01-07T23:14:00.410 回答
0

这看起来很奇怪,您的代码应该可以工作......无论如何,您也可以尝试Genson library,它具有与 Gson 相似的功能以及其他一些功能和更好的性能。

以下是使用 Genson 实现它的方法:

Genson genson = new Genson();
Filter[] filters = genson.deserialize(json, Filter[].class);

// or if you need a list
List<Filter> filters = genson.deserialize(json, new GenericType<List<Filter>>(){});
于 2013-01-08T00:38:38.777 回答
0

它可以先解析为数组,然后转换为列表。

final Gson gson = new Gson();
final Filter[] values = gson.fromJson(json, Filter[].class);
ArrayList< Filter > filterList = new ArrayList< Filter >(Arrays.asList(values));
于 2015-07-10T16:36:46.277 回答