不同的JSON数组响应

时间:2013-05-13 09:01:08

标签: java json rest deserialization gson

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

1 个答案:

答案 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