[英]java jsonobject "value" and "num"
使用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 時,輸出沒有“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"}
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)
它將添加一個帶有String
鍵OrderID
和JsonValue
值的條目
// 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.JsonObject
是Gson
的已知類型。 它知道它是特殊的,而不是自定義的 POJO 類型。 因此,它可以直接編寫它,而不必進一步序列化它。
這類似於我在這里回答的一個問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.