簡體   English   中英

java jsonobject“value”和“num”

[英]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)

它將添加一個帶有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 類型。 因此,它可以直接編寫它,而不必進一步序列化它。


這類似於我在這里回答的一個問題:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM