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)
它将添加一个带有 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 类型。因此它可以直接写入,而不必进一步序列化。
这类似于我在这里回答的问题:
- Returning JsonObject using @ResponseBody in SpringMVC
当使用 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)
它将添加一个带有 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 类型。因此它可以直接写入,而不必进一步序列化。
这类似于我在这里回答的问题:
- Returning JsonObject using @ResponseBody in SpringMVC