应为 BEGIN_ARRAY,但在第 1 行第 1 列路径为 STRING

Posted

技术标签:

【中文标题】应为 BEGIN_ARRAY,但在第 1 行第 1 列路径为 STRING【英文标题】:Expected BEGIN_ARRAY but was STRING at line 1 column 1 path 【发布时间】:2021-10-27 00:33:11 【问题描述】:

我正在尝试从应用程序中传递 JSON 文件以填充一些视图并在应用程序中执行一些功能,但我不断收到此错误。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $

我已经阅读了以前关于类似主题的大部分答案,但没有一个解决方案适合我。

这是我传入我的 json 文件。

ArrayList<ControlProperty> controlProperty = new Gson().fromJson("json_file.json", new TypeToken<List<ControlProperty>>() .getType());

这是我的模型。

public class ControlProperty 
    private String type;
    private String label;
    private String name;
    private String subtype;
    private String dependency;
    private String description;
    private String placeholder;
    private String dependencyType;
    private String selectDependencyOption;
    private int minlength;
    private int maxlength;
    private long maxSize;
    private String pageType;
    private String expectedFormat;
    private String maxDate;
    private String minDate;


然后是json结构

[
  
    "type": "Head",
    "label": "All fields are necessary.",
    "subtype": "h1",
    "dependency": "",
    "controlId": "frmb-1557846206638-fld-1",
    "currentDate": false,
    "pageType": "new-page",
    "headerSize": "s",
    "isFieldDependent": false
  ,

  
    "required": true,
    "name": "text-1550823191761",
    "type": "text_input",
    "label": "Surname",
    "minlength": "1",
    "maxlength": "50",
    "subtype": "text_input",
    "dependency": "",
    "controlId": "frmb-1557846206638-fld-2",
    "currentDate": false,
    "pushFieldLink": "surname",
    "isFieldDependent": false,
  ,
  
    "name": "text-1550823211048",
    "type": "text_input",
    "label": "Middle Name",
    "minlength": "1",
    "maxlength": "50",
    "subtype": "text",
    "dependency": "",
    "controlId": "frmb-1557846206638-fld-3",
    "currentDate": false,
    "pushFieldLink": "middle_name",
    "isFieldDependent": false,
  
]

【问题讨论】:

【参考方案1】:

第一个问题: 以下字段在您的数据模型中定义为 int,但您的 JSON 将其显示为字符串:minlengthmaxlength

至于实际的Gson转换:

    我假设您将 json_file.json 替换为实际的 JSON 文件内容 - 文件名不会这样做。 对于 ArrayList 本身,试试这个:
ArrayList<ControlProperty> items = new ArrayList<>(Arrays.asList(new Gson().fromJson(jsonString, ControlProperty[].class)));

这会将 Json 字符串转换为 ControlProperty 类数组 (ControlProperty[]) - 然后您只需将 array 添加到 ArrayList 中。

【讨论】:

这确实很有帮助,但是即使在更改了文件模型并以这种方式转换后,仍然会出现相同的错误 ``` ArrayList items = new ArrayList(Arrays.asList(new Gson ().fromJson(jsonString, ControlProperty[].class))); ```【参考方案2】:

以及其他人对更改 ControlProperty 类中的属性类型的建议

            InputStream is = loader.getResourceAsStream("input.json");

            Reader reader = new InputStreamReader(is);

            Type listType = new TypeToken<List<ControlProperty>>() .getType();
            List<ControlProperty> posts = new Gson().fromJson(reader, listType)

【讨论】:

以上是关于应为 BEGIN_ARRAY,但在第 1 行第 1 列路径为 STRING的主要内容,如果未能解决你的问题,请参考以下文章

预期 BEGIN_ARRAY 但在第 1 行第 2 列是 BEGIN_OBJECT。如何解决?

预期BEGIN_ARRAY但在第1行第2列是BEGIN_OBJECT

获得错误预期BEGIN_ARRAY但在第1行第2列路径$是BEGIN_OBJECT

AsyncTask 预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2

使用改造调用服务时出错 Expected BEGIN_ARRAY 但在第 1 行第 1 列路径 $ 处为 STRING