Java Gson无法将json对象中的json数组字符串解析为JsonArray
上下文: 我正在尝试使用gson将以下JSON转换为javapojo JSON:Java Gson无法将json对象中的json数组字符串解析为JsonArray,java,android,json,gson,Java,Android,Json,Gson,上下文: 我正在尝试使用gson将以下JSON转换为javapojo JSON: { "task": "findRecords", "foundRecords": "[1234567, 11234512]", "logs": "records found [1234567, 11234512]", "status": "success" } POJO类: public class JavaPojo { String task = null; Js
{
"task": "findRecords",
"foundRecords": "[1234567, 11234512]",
"logs": "records found [1234567, 11234512]",
"status": "success"
}
POJO类:
public class JavaPojo {
String task = null;
JsonArray foundRecords = null;
String logs = null;
String status = null;
}
转换逻辑:
JavaPojo pojo = gson.fromJson(jsonString, JavaPojo.class);
其中jsonString
是上述json的字符串表示形式
问题:
转换逻辑在以下情况下失败:
com.google.gson.JsonSyntaxException:应为com.google.gson.JsonArray,但为com.google.gson.JsonPrimitive
据我所知,gson将foundRecords
的值解释为纯字符串,而不是将其解析为数组
现在为了解决这个问题,我将foundRecords
从JsonArray
修改为String
。
转换成功进行
在将foundRecords
的类型保留为JsonArray
的同时,如何实现转换
注意:
在将foundRecords
转换为String
之后,我尝试使用gson将foundRecords
的字符串值转换为JsonArray
,效果非常奇怪
//This works
//Map json to pojo
JavaPojo pojo = gson.fromJson(jsonString, JavaPojo.class);
//Convert foundRecords into a JsonArray
JsonArray arr = gson.fromJson(pojo.getFoundRecords(), JsonArray.class);
所以现在我很困惑,如果gson可以将
string
typefoundRecords
转换为JsonArray
,那么为什么它不能更早地执行转换呢?我知道restapi响应不好,并且违反了JSON语法。
解决方案是更正RESTAPI,但在我的场景中,我无法请求API更正,所以我在末尾编写了一个util来清理jsonString
如果对任何人有帮助,请在此处发布:
/**
* @param malformedArrayKey
* - Name of the key in the JSON object that has a malformed array
* for e.g consider following JSON object having a bad formed array
* <pre>
* {
* "task": "findRecords",
* "foundRecords": "[1234567, 11234512]",
* }
* </pre>
* @param jsonString
* - String representation of the JSON object containing the malformed array
* @return - json string having well formed array against the key {@code malformedArrayKey} supplied
* <pre>
* {
* "task": "findRecords",
* "foundRecords": [1234567, 11234512]
* }
* </pre>
*/
public static String formatMalformedArray(String malformedArrayKey, String jsonString) {
JsonObject jsonObj = gson.fromJson(jsonString, JsonObject.class);
// get the faulty key value
String malformedArrayKeyValue = jsonObj.get(malformedArrayKey)
.getAsString();
// drop it
jsonObj.remove(malformedArrayKey);
// create a array out of the malformed array string
JsonArray jsonArray = gson.fromJson(malformedArrayKeyValue, JsonArray.class);
// add the array back to the object
jsonObj.add(malformedArrayKey, jsonArray);
// now convert it into a well formed json string
return jsonObj.toString();
}
/**
*@param格式不正确的Darraykey
*-JSON对象中具有格式错误数组的键的名称
*考虑下列具有坏数组的JSON对象
*
* {
*“任务”:“findRecords”,
*“foundRecords”:“[123456711234512]”,
* }
*
*@param jsonString
*-包含格式错误数组的JSON对象的字符串表示形式
*@return-json字符串具有针对提供的键{@code malformadarraykey}的格式良好的数组
*
* {
*“任务”:“findRecords”,
*“foundRecords”:[123456711234512]
* }
*
*/
公共静态字符串格式MalformedArray(字符串MalformedArray键,字符串jsonString){
JsonObject jsonObj=gson.fromJson(jsonString,JsonObject.class);
//获取错误的键值
字符串malformedArrayKeyValue=jsonObj.get(malformedArrayKey)
.getAsString();
//放下它
jsonObj.remove(格式错误的DarrayKey);
//使用格式错误的数组字符串创建数组
JsonArray JsonArray=gson.fromJson(格式不正确的rayKeyValue,JsonArray.class);
//将数组添加回对象
add(格式错误的DarrayKey,jsonArray);
//现在将其转换为格式良好的json字符串
返回jsonObj.toString();
}
该方法非常基本,但它满足了我的用例。为什么不使用String[]而不是JsonArray并使用“foundRecords”:[“1234567”,“11234512”],
“[1234567112334512]”。
不是JSON数组,而是JSON字符串。JSON数组应该是[1234567112334512]
,因此,将字符串的值解析为JSON到数组中并不奇怪。请参阅了解JSON语法。解决方案:告诉生成JSON的人正确生成它,即不要将数组转换为字符串。感谢andreas指出它,应该已经看到了!我的错