【问题标题】:java jsonobject "value" and "num"java jsonobject“值”和“num”
【发布时间】:2015-07-01 01:16:22
【问题描述】:

使用javax json ObjectBuilder构建json时,输出的json字符串在json字符串中包含“value”和“num”。当 json 包含“value”和“num”时,我的 Web 服务会引发序列化错误。有谁知道为什么输出有“value”和“num”?

示例:

JsonObject addProductRequest = Json.createObjectBuilder()
            .add("OrderID", orderId)
            .add("Product", productId)
            .add("Quantity", qty)
            .add("access_token", access_token)
            .build();

输出:

{
  "OrderID": {
    "num": 15498
  },
  "ProductID": {
    "num": 20
  },
  "Quantity": {
    "num": 1
  },
  "access_token": {
    "value": "1f6c689d-6956-4f8e-b259-9030d57bec4b"
  }
}

当我切换到使用 google.gson.JsonObject 时,输出没有我的 Web 服务接受的“value”和“num”字符串,而且一切似乎都运行良好。 例子

 com.google.gson.JsonObject addProductRequest = new com.google.gson.JsonObject();
    addProductRequest.addProperty("OrderID", orderId);
    addProductRequest.addProperty("Product", productId);
    addProductRequest.addProperty("Quantity", qty);
    addProductRequest.addProperty("access_token", access_token);

输出:

{  "OrderID": 15499,  "Product": 20,  "Quantity": 1,  "access_token": "3241cfd4-7b6c-4eac-b2bb-9b2b0c780831"}

【问题讨论】:

  • 你在序列化什么?向我们展示 POJO 并向我们展示代码。
  • 已更新代码。没有 POCO,只是使用构建器。
  • 你从哪里得到String 值?或者怎么输出addProductRequest
  • 放心日志输出的结果字符串。
  • 您必须检查放心记录它的方式。调用 addProductRequest.toString() 会为我返回预期的 json String 值,以及 javax.json 的 glassfish 1.0.4 实现。

标签: java json jsonobject


【解决方案1】:

Rest Assured 似乎使用 Gson 将 POJO(您应该将其用作响应实体)序列化到响应正文。

Gson 对javax.json 一无所知。您正在使用的javax.json 的实现基本上具有这种格式的JsonObject

private static final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements JsonObject {
    private final Map<String, JsonValue> valueMap;      // unmodifiable

由于这是一个Map,Gson 使用特殊的序列化,迭代其entrySet 并将每个Entry 用作JSON 键值对(在JSON 对象内)。

在这种情况下,entrySet 返回

@Override
public Set<Entry<String, JsonValue>> entrySet() {
    return valueMap.entrySet();
} 

valueMap 包含您在构建器中使用add 添加的所有值。例如,对于

.add("OrderID", 1)

它将添加一个带有StringOrderIDJsonValue 值的条目

// Optimized JsonNumber impl for int numbers.
private static final class JsonIntNumber extends JsonNumberImpl {
    private final int num;

注意num 字段。

所以 Gson 现在将看到这个 JsonIntNumber 类型的值。它认为它是一个 POJO,因此将其序列化为 JSON 对象,其字段为键值对。因此它产生了

{
    "num": 15498
}

com.google.gson.JsonObjectGson 的已知类型。它知道它是特殊的而不是自定义的 POJO 类型。因此它可以直接编写它,而不必进一步序列化它。


这类似于我在这里回答的一个问题:

【讨论】:

  • 谢谢。这解释了它。
猜你喜欢
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2012-02-06
  • 2012-01-10
相关资源
最近更新 更多