我有以下字符串:
"[{\"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
感谢您的帮助!
答案 0 :(得分: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());
答案 1 :(得分:1)
您尝试解析什么?你有什么字符串,你需要两个步骤
答案 2 :(得分: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>>(){});
答案 3 :(得分:0)
可以先将其解析为数组,然后转换为列表。
final Gson gson = new Gson();
final Filter[] values = gson.fromJson(json, Filter[].class);
ArrayList< Filter > filterList = new ArrayList< Filter >(Arrays.asList(values));