java jsonobject" value"和" num"

时间:2015-07-01 01:16:23

标签: java json jsonobject

当使用javax json ObjectBuilder构建json时,输出json字符串包含" value"和" num"在json字符串中。当json包含" value"我的Web服务是throw序列化错误。和" num"。任何人都知道为什么输出有"值"和" 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时,输出没有"值"和" 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"}

1 个答案:

答案 0 :(得分:1)

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

Gson对params?.type一无所知。您正在使用的javax.json的实施基本上具有javax.json的格式:

JsonObject

由于这是一个private static final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements JsonObject { private final Map<String, JsonValue> valueMap; // unmodifiable ,Gson使用特殊的序列化,遍历其Map并使用每个entrySet作为JSON键值对(在JSON对象中)。

在这种情况下,Entry会返回

entrySet

@Override public Set<Entry<String, JsonValue>> entrySet() { return valueMap.entrySet(); } 包含您在构建器中使用valueMap添加的所有值。例如,对于

add

它会添加一个包含.add("OrderID", 1) StringOrderID

的条目
JsonValue

请注意// Optimized JsonNumber impl for int numbers. private static final class JsonIntNumber extends JsonNumberImpl { private final int num; 字段。

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

JsonIntNumber

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

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