Java Gson无法将json对象中的json数组字符串解析为JsonArray

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

上下文:

我正在尝试使用gson将以下JSON转换为javapojo

JSON:

    {
    "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
type
foundRecords
转换为
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指出它,应该已经看到了!我的错