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" 字符串,我的 Web 服务接受这些字符串并且一切似乎都正常。 例子

 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 returns

@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 类型。因此它可以直接写入,而不必进一步序列化。


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

  • Returning JsonObject using @ResponseBody in SpringMVC