use*_*485 23 java parsing json gson
我正在尝试使用具有以下结构的Java中的gson解析一些JSON数据,但通过在线查看示例,我找不到任何可以完成这项工作的东西.
有人能帮忙吗?
{
"data":{
"id":[
{
"stuff":{
},
"values":[
[
123,
456
],
[
123,
456
],
[
123,
456
],
],
"otherStuff":"blah"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*ikO 47
您只需要创建一个表示JSON中数据的Java类结构.为了做到这一点,我建议你将你的JSON复制到这个在线JSON查看器中,你会看到你的JSON结构更加清晰......
基本上你需要这些类(伪代码):
class Response
Data data
class Data
List<ID> id
class ID
Stuff stuff
List<List<Integer>> values
String otherStuff
Run Code Online (Sandbox Code Playgroud)
请注意,类中的属性名称必须与JSON字段的名称匹配!您可以根据实际的JSON结构添加更多属性和类...还要注意,您需要所有属性的getter和setter!
最后,您只需要将JSON解析为Java类结构:
Gson gson = new Gson();
Response response = gson.fromJson(yourJsonString, Response.class);
Run Code Online (Sandbox Code Playgroud)
就是这样!现在,您可以response
使用getter和setter 访问对象中的所有数据...
例如,要访问第一个值456
,您需要执行以下操作:
int value = response.getData().getId().get(0).getValues().get(0).get(1);
Run Code Online (Sandbox Code Playgroud)
Ori*_*eil 12
取决于您要做的事情.你可以设置一个与你json
在这里看到的匹配的POJO层次(首选方法).或者,您可以提供自定义反序列化程序.我只处理了id
数据,因为我认为这是一个棘手的实现.只需逐步json
使用gson
类型,并构建您尝试表示的数据.在Data
和Id
类是刚刚pojos
组成的,并反映在原有的属性json
字符串.
public class MyDeserializer implements JsonDeserializer<Data>
{
@Override
public Data deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException
{
final Gson gson = new Gson();
final JsonObject obj = je.getAsJsonObject(); //our original full json string
final JsonElement dataElement = obj.get("data");
final JsonElement idElement = dataElement.getAsJsonObject().get("id");
final JsonArray idArray = idElement.getAsJsonArray();
final List<Id> parsedData = new ArrayList<>();
for (Object object : idArray)
{
final JsonObject jsonObject = (JsonObject) object;
//can pass this into constructor of Id or through a setter
final JsonObject stuff = jsonObject.get("stuff").getAsJsonObject();
final JsonArray valuesArray = jsonObject.getAsJsonArray("values");
final Id id = new Id();
for (Object value : valuesArray)
{
final JsonArray nestedArray = (JsonArray)value;
final Integer[] nest = gson.fromJson(nestedArray, Integer[].class);
id.addNestedValues(nest);
}
parsedData.add(id);
}
return new Data(parsedData);
}
Run Code Online (Sandbox Code Playgroud)
}
测试:
@Test
public void testMethod1()
{
final String values = "[[123, 456], [987, 654]]";
final String id = "[ {stuff: { }, values: " + values + ", otherstuff: 'stuff2' }]";
final String jsonString = "{data: {id:" + id + "}}";
System.out.println(jsonString);
final Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, new MyDeserializer()).create();
System.out.println(gson.fromJson(jsonString, Data.class));
}
Run Code Online (Sandbox Code Playgroud)
结果:
Data{ids=[Id {nestedList=[[123, 456], [987, 654]]}]}
Run Code Online (Sandbox Code Playgroud)
POJO:
public class Data
{
private List<Id> ids;
public Data(List<Id> ids)
{
this.ids = ids;
}
@Override
public String toString()
{
return "Data{" + "ids=" + ids + '}';
}
}
public class Id
{
private List<Integer[]> nestedList;
public Id()
{
nestedList = new ArrayList<>();
}
public void addNestedValues(final Integer[] values)
{
nestedList.add(values);
}
@Override
public String toString()
{
final List<String> formattedOutput = new ArrayList();
for (Integer[] integers : nestedList)
{
formattedOutput.add(Arrays.asList(integers).toString());
}
return "Id {" + "nestedList=" + formattedOutput + '}';
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
52554 次 |
最近记录: |