为什么 JsonParser 在 return 值中给出双引号,使用 com.google.gson API
Why JsonParser gives double quotes in the return value, using com.google.gson API
我目前正在使用 JsonObject 和 JsonParser com.google.gson api(使用 gson-2.8.5 版本)来解析和读取输入的值JSON。
当我尝试从 json 中读取相同的值时,我有 JSON 像 smaple "resultCode":"SUCCESS",
这样的文件,它给出的结果是 ""SUCCESS""
.
我正在读取的每个值都带有双“”不知道为什么?您可以参考下面我的调试屏幕。
我是 Json 和解析器的新手,这是默认行为吗?
我期待 "SUCCESS"
、"S"
、"00000000"
不像 ""SUCCESS""
或 ""S""
或 ""00000000""
我在下图中突出显示了相同的内容。
请分享我们如何在没有“””双引号字符串的情况下获得字符串的绝对值,这会导致我的字符串比较失败。
String response_result = "{\"response\": {\"head\": {\"function\": \"acquiring.order.create\",\"version\": \"2.0\",\"clientId\": \"201810300000\",\"reqMsgId\": \"56805892035\",\"respTime\": \"2019-09-13T13:18:08+08:00\"},\"body\": {\"resultInfo\": {\"resultCode\": \"SUCCESS\",\"resultCodeId\": \"00000000\",\"resultStatus\": S,\"resultMsg\": \"SUCCESS\"},\"acquirementId\": \"2018080834569894848930\",\"merchantTransId\": \"5683668701112717398\",\"checkoutUrl\": \"http://localhost:8081/crm/operator/operator-search-init.action\"}},\"signature\":\"d+TUYLvt1a491R1e6aO8i9VwXWzVhfNgnhD0Du74f4RgBQ==\"}";
HttpInvoker.Result result = i.new Result(200, response_result);
JsonObject jo = new JsonParser().parse(response_result).getAsJsonObject();
String resultCode = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultCode").toString();
String resultCodeId = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultCodeId").toString();
String resultStatus = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultStatus").toString();
String checkoutUrl = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("checkoutUrl").toString();
if ( RESULT_CODE_GCASH_SUCCESS.equals(resultCode)
&& RESULT_STATUS_SUCCESS.equals(resultStatus)
&& StringUtils.isNotEmpty(checkoutUrl)) {
log.error("Testing ".concat(resultCode).concat(resultStatus).concat(checkoutUrl));
}
log.error("Testing ".concat(resultCode).concat(resultStatus).concat(checkoutUrl));
}
这是我的输入JSON
{
"response":{
"head":{
"function":"acquiring.order.create",
"version":"2.0",
"clientId":"201810300000",
"reqMsgId":"56805892035",
"respTime":"2019-09-13T13:18:08+08:00"
},
"body":{
"resultInfo":{
"resultCode":"SUCCESS",
"resultCodeId":"00000000",
"resultStatus":"S",
"resultMsg":"SUCCESS"
},
"acquirementId":"2018080834569894848930",
"merchantTransId":"5683668701112717398",
"checkoutUrl":"http://localhost:8081/crm/operator/operator-search-init.action"
}
},
"signature":"d+TUYLvtI38YL2hresd98Ixu1BXccvvh1IQMiHuMXUEeW/N5exUsW491R1e6aO8i9VwXWzVhfNgnhD0Du74f4RgBQ=="
}
JsonParser
将您的 json 解析为 JsonElement
结构。您看到的行为是正常的,因为您使用的是 JsonElement
的 toString
方法。要实现您的目标,只需使用 JsonElement::getAsString
方法:
String resultCode = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultCode").getAsString();
给出 SUCCESS
而不是 "SUCCESS"
请注意,JsonElement
是一个抽象 class 和 classes,扩展此 class,将覆盖那些辅助 getAs...
方法。在你的情况下 JsonPrimitive::getAsString
将被调用。
您也可以为您的 json 创建一个 POJO class 并使用 Gson::fromJson
将 json 解析为您的 POJO class 的对象。
根据@Michalk 的输入:
我知道读取 JSON 数据的简单方法是使用 Gson::fromJson 并为输出 json 创建 POJO class。
我已经生成 POJO 类 使用此 link 提供我的示例输入 JSON
现在我调用了 POJO 类:CreateOrderJSONResponse
Gson::fromJson
样本:
Gson gson = new Gson();
CreateOrderJSONResponse responseJson = gson.fromJson(inputJSON, CreateOrderJSONResponse.class);
访问子数据:
String resultCodeText = responseJson.getResponse().getBody().getResultInfo().getResultCode();
String resultCodeId = responseJson.getResponse().getBody().getResultInfo().getResultCodeId();
String resultStatus = responseJson.getResponse().getBody().getResultInfo().getResultStatus();
String checkoutUrl = responseJson.getResponse().getBody().getCheckoutUrl();
上面的 Gson::fromJson
示例运行流畅,与使用以下示例代码直接访问文件相比看起来更整洁:
JsonObject jo = parser.parse(inputJSON).getAsJsonObject();
String resultCodeText = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().getAsJsonPrimitive("resultCode").getAsString();
String resultCodeId = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().getAsJsonPrimitive("resultCodeId").getAsString();
String resultStatus = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().getAsJsonPrimitive("resultStatus").getAsString();
String checkoutUrl = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().getAsJsonPrimitive("checkoutUrl").getAsString();
注意:
我发现 JSON 或 JAVA 的 link、SCALA、POJO 生成器工具为 GitHub 访问 您可以在此处
访问
我目前正在使用 JsonObject 和 JsonParser com.google.gson api(使用 gson-2.8.5 版本)来解析和读取输入的值JSON。
当我尝试从 json 中读取相同的值时,我有 JSON 像 smaple "resultCode":"SUCCESS",
这样的文件,它给出的结果是 ""SUCCESS""
.
我正在读取的每个值都带有双“”不知道为什么?您可以参考下面我的调试屏幕。
我是 Json 和解析器的新手,这是默认行为吗?
我期待 "SUCCESS"
、"S"
、"00000000"
不像 ""SUCCESS""
或 ""S""
或 ""00000000""
我在下图中突出显示了相同的内容。
请分享我们如何在没有“””双引号字符串的情况下获得字符串的绝对值,这会导致我的字符串比较失败。
String response_result = "{\"response\": {\"head\": {\"function\": \"acquiring.order.create\",\"version\": \"2.0\",\"clientId\": \"201810300000\",\"reqMsgId\": \"56805892035\",\"respTime\": \"2019-09-13T13:18:08+08:00\"},\"body\": {\"resultInfo\": {\"resultCode\": \"SUCCESS\",\"resultCodeId\": \"00000000\",\"resultStatus\": S,\"resultMsg\": \"SUCCESS\"},\"acquirementId\": \"2018080834569894848930\",\"merchantTransId\": \"5683668701112717398\",\"checkoutUrl\": \"http://localhost:8081/crm/operator/operator-search-init.action\"}},\"signature\":\"d+TUYLvt1a491R1e6aO8i9VwXWzVhfNgnhD0Du74f4RgBQ==\"}";
HttpInvoker.Result result = i.new Result(200, response_result);
JsonObject jo = new JsonParser().parse(response_result).getAsJsonObject();
String resultCode = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultCode").toString();
String resultCodeId = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultCodeId").toString();
String resultStatus = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultStatus").toString();
String checkoutUrl = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("checkoutUrl").toString();
if ( RESULT_CODE_GCASH_SUCCESS.equals(resultCode)
&& RESULT_STATUS_SUCCESS.equals(resultStatus)
&& StringUtils.isNotEmpty(checkoutUrl)) {
log.error("Testing ".concat(resultCode).concat(resultStatus).concat(checkoutUrl));
}
log.error("Testing ".concat(resultCode).concat(resultStatus).concat(checkoutUrl));
}
这是我的输入JSON
{
"response":{
"head":{
"function":"acquiring.order.create",
"version":"2.0",
"clientId":"201810300000",
"reqMsgId":"56805892035",
"respTime":"2019-09-13T13:18:08+08:00"
},
"body":{
"resultInfo":{
"resultCode":"SUCCESS",
"resultCodeId":"00000000",
"resultStatus":"S",
"resultMsg":"SUCCESS"
},
"acquirementId":"2018080834569894848930",
"merchantTransId":"5683668701112717398",
"checkoutUrl":"http://localhost:8081/crm/operator/operator-search-init.action"
}
},
"signature":"d+TUYLvtI38YL2hresd98Ixu1BXccvvh1IQMiHuMXUEeW/N5exUsW491R1e6aO8i9VwXWzVhfNgnhD0Du74f4RgBQ=="
}
JsonParser
将您的 json 解析为 JsonElement
结构。您看到的行为是正常的,因为您使用的是 JsonElement
的 toString
方法。要实现您的目标,只需使用 JsonElement::getAsString
方法:
String resultCode = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().get("resultCode").getAsString();
给出 SUCCESS
而不是 "SUCCESS"
请注意,JsonElement
是一个抽象 class 和 classes,扩展此 class,将覆盖那些辅助 getAs...
方法。在你的情况下 JsonPrimitive::getAsString
将被调用。
您也可以为您的 json 创建一个 POJO class 并使用 Gson::fromJson
将 json 解析为您的 POJO class 的对象。
根据@Michalk 的输入: 我知道读取 JSON 数据的简单方法是使用 Gson::fromJson 并为输出 json 创建 POJO class。
我已经生成 POJO 类 使用此 link 提供我的示例输入 JSON 现在我调用了 POJO 类:CreateOrderJSONResponse
Gson::fromJson
样本:
Gson gson = new Gson();
CreateOrderJSONResponse responseJson = gson.fromJson(inputJSON, CreateOrderJSONResponse.class);
访问子数据:
String resultCodeText = responseJson.getResponse().getBody().getResultInfo().getResultCode();
String resultCodeId = responseJson.getResponse().getBody().getResultInfo().getResultCodeId();
String resultStatus = responseJson.getResponse().getBody().getResultInfo().getResultStatus();
String checkoutUrl = responseJson.getResponse().getBody().getCheckoutUrl();
上面的 Gson::fromJson
示例运行流畅,与使用以下示例代码直接访问文件相比看起来更整洁:
JsonObject jo = parser.parse(inputJSON).getAsJsonObject();
String resultCodeText = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().getAsJsonPrimitive("resultCode").getAsString();
String resultCodeId = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().getAsJsonPrimitive("resultCodeId").getAsString();
String resultStatus = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().get("resultInfo").getAsJsonObject().getAsJsonPrimitive("resultStatus").getAsString();
String checkoutUrl = jo.get("response").getAsJsonObject().get("body").getAsJsonObject().getAsJsonPrimitive("checkoutUrl").getAsString();
注意: 我发现 JSON 或 JAVA 的 link、SCALA、POJO 生成器工具为 GitHub 访问 您可以在此处
访问