不同的JSON数组响应

Mit*_*ogl 2 java rest json gson deserialization

我在解析两个不同的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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

2:我从测试客户那里得到的回复.我在列表中添加了一些值,然后用于gson.toJson测试输出.

[
  {
    "idGear": "1",
    "name": "lala",
    "year": 2000,
    "price": 15.0
  }, {
    "idGear": "2",
    "name": "lala2",
    "year": 2000,
    "price": 125.0
  }
]
Run Code Online (Sandbox Code Playgroud)

它们都有效,但第二个成功反序列化为对象,如下所示:

Type listType = new TypeToken<List<Gear>>() {}.getType();
List<Gear> gears= (List<Gear>) gson.fromJson(json, listType); 
Run Code Online (Sandbox Code Playgroud)

对于第一个,我试图以相同的方式反序列化,但我得到错误.


编辑

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");
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

Mik*_*ikO 9

JSON响应不同!

  • 第一个是一个被包围的对象,{ }它包含一个字段"gear",该字段又是一个被包围的对象列表[ ].

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

所以,显然他们不能以同样的方式解析......

第二个正在被正确解析,因为您使用的List是一个列表.但是对于第一个,你需要另一个包含一个字段的类,该字段又包含一个列表......也就是说,你只需要创建一个代表你的JSON响应的类结构......

public class Response {    
    private List<Gear> gears;        
    //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以解析第一个回复:

Gson gson = new Gson();
Response response = gson.fromJson(json, Response .class);
List<Gear> gears = response.getGears();
Run Code Online (Sandbox Code Playgroud)

我建议你简要介绍一下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 
Run Code Online (Sandbox Code Playgroud)