我在解析两个不同的JSON响应时遇到问题。
1:这是我从RESTful API获得的JSON响应:
{
"gear": [
{
"idGear": "1",
"name": "Nosilec za kolesa",
"year": "2005",
"price": "777.0"
}, {
"idGear": "2",
"name": "Stresni nosilci",
"year": "1983",
"price": "40.0"
}
]
}
2:我从测试客户那里得到的回复。我在列表中添加了一些值,然后使用gson.toJson
来测试输出。
[
{
"idGear": "1",
"name": "lala",
"year": 2000,
"price": 15.0
}, {
"idGear": "2",
"name": "lala2",
"year": 2000,
"price": 125.0
}
]
它们都有效,但第二个成功反序列化为对象:
Type listType = new TypeToken<List<Gear>>() {}.getType();
List<Gear> gears= (List<Gear>) gson.fromJson(json, listType);
对于第一个,我试图以相同的方式反序列化,但我得到错误。
修改的
API方法:
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Gear> getGear() {
List<Gear> gears = gearDAO.getGears();
if (!gears.isEmpty()) {
return gears;
} else
throw new RuntimeException("No gears");
}
CLIENT序列化代码:
List<Gear> list = new ArrayList<Gear>();
Gear o = new Gear();
o.setPrice(15);
o.setYear(2000);
o.setName("asds");
Type listTypes = new TypeToken<List<Gear>>() {}.getType();
gson.toJson(list, listTypes);
答案 0 :(得分:9)
JSON响应不同!
第一个是由{ }
包围的对象,其中包含一个字段"gear"
,该字段又是[ ]
所包围的对象列表。
第二个是直接的对象列表,因为它被[ ]
包围。即,整个第二响应等同于第一响应中的字段。
所以,显然他们不能以同样的方式解析......
第二个正在被正确解析,因为您正在使用List
并且它是一个列表。但是对于第一个,你需要另一个包含一个字段的类,该字段又包含一个列表......也就是说,你只需要创建一个代表你的JSON响应的类结构......
public class Response {
private List<Gear> gears;
//getters & setters
}
现在,您可以通过以下方式解析第一个回复:
Gson gson = new Gson();
Response response = gson.fromJson(json, Response .class);
List<Gear> gears = response.getGears();
我建议你简要介绍json.org以了解JSON语法,这非常简单...... 基本上这些是可能的JSON元素:
object
{}
{ members }
members
pair
pair , members
pair
string : value
array
[]
[ elements ]
elements
value
value , elements
value
string
number
object
array
true
false
null