当使用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"}
答案 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)
键String
和OrderID
值
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类型。因此它可以直接编写,而不必进一步序列化。
这类似于我在这里回答的一个问题: