【问题标题】:Different JSON array response不同的 JSON 数组响应
【发布时间】:2013-05-13 09:01:07
【问题描述】:

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

【问题讨论】:

    标签: java json rest deserialization gson


    【解决方案1】:

    JSON 响应不同!

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

    • 第二个直接是对象列表,因为它被[ ]包围。即整个 2nd response 等价于 1st response 中的字段。

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

    第二个被正确解析,因为您使用的是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 
    

    【讨论】:

    • restful api 和 testClient 都返回 List&lt;gears&gt; 但响应不同。不知道为什么?
    • 好吧,正如我所说,API 不只是返回一个List...它返回一个包含List 字段的对象。事实上,它返回的具体数据类型是Map&lt;String, Gear&gt;,但不是List&lt;Gear&gt;...我认为这个API 不是由你控制的,对吧? REST API 以这种方式返回数据是很常见的,总是包含在一个带有字段 "response"(在您的情况下为 "gears")或类似的对象中......
    • API 是我的,它返回 List,所以我很困惑。
    • 那我也很困惑 ;) 请包括 API 的代码和将对象序列化为 JSON 的测试客户端,我可能会发现不同之处...
    • 在您的客户端中,您使用 Gson (gson.toJson()) 序列化您的 List,因此结果是预期的。但是,在您的 API 方法中,您不会使用 Gson 序列化 List ...我不是 JAX-RS 专家,但我猜想序列化是由一些产生不同 JSON 的 JAX-RS 工具执行的对于相同的结构...这不是不正确的,但这只是相同信息的另一种表示形式,正如我所说,在 REST 服务中返回这样的数据是很常见的,包含在字段 "response" 或 wahtever 名称中。 .. JAX-RS 帮不了你太多...
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多