3

我在解析两个不同的 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");
}

客户端序列化代码:

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);
4

1 回答 1

10

JSON 响应不同!

  • 第一个是一个对象,由 包围{ },其中包含一个字段"gear",该字段又是一个对象列表,由 包围[ ]

  • 第二个直接是对象列表,因为它被[ ]. 即,整个第 2 响应等同于第 1 响应中的字段。

所以,显然它们不能以相同的方式解析......

第二个被正确解析,因为您使用的是 aList并且它是一个列表。但是对于第一个,您需要另一个包含一个字段的类,该字段又包含一个列表...也就是说,您只需要创建一个代表您的 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 
于 2013-05-13T11:33:35.223 回答