当前位置: 首页 > 知识库问答 >
问题:

Gson需要BEGIN_数组,但在第1行第62列为字符串[重复]

彭宏义
2023-03-14

我有以下课程:

final class CFS {
    public Map<String, String> files = new HashMap<String, String>();
    public List<String> directories = new ArrayList<String>();
}

这段代码应该解析json:

CFS cfs = JStorage.getGson().fromJson(JSON_STRING, CFS.class);

哪里

JSON_STRING = "{\"directories\" : [\"folder1\", \"folder1/folder2\"], \"files\" : [{\"folder1\" : \"file.txt\"}, {\"folder1/folder2\" : \"file.cfg\"}]}"

JSON是:

{
  "directories": ["folder1", "folder1/folder2"],
  "files": [
    {
      "folder1": "file.txt"
    }, 
    {
      "folder1/folder2": "file.cfg"
    }
  ]
}

我得到的错误是:应该是BEGIN_数组,但在第1行第62列是字符串

但我不知道为什么,根据jsonlint,json是有效的。

知道我为什么会出现这个错误吗?

共有3个答案

邓元白
2023-03-14

正如Brain已经指出的,你有一个对象数组,所以你需要用自定义的反序列化程序来转换它。

下面是一个示例实现:

public class q16380367 {
    final class CFS {
        public HashMap<String, String> files = new HashMap<String, String>();
        public ArrayList<String> directories = new ArrayList<String>();
    }

    public static void main(String[] args) {
        new q16380367();
    }

    public q16380367() {
        String JSON_STRING = "{\"directories\" : [\"folder1\", \"folder1/folder2\"], \"files\" : [{\"folder1\" : \"file.txt\"}, {\"folder1/folder2\" : \"file.cfg\"}]}";
        Gson gson = new GsonBuilder().registerTypeAdapter(
                new TypeToken<HashMap<String, String>>() {
                }.getType(), new CfsDeserializer()).create();
        CFS foo = gson.fromJson(JSON_STRING, CFS.class);
    }

    private final class CfsDeserializer implements
            JsonDeserializer<HashMap<String, String>> {
        @Override
        public HashMap<String, String> deserialize(JsonElement json,
                Type typeOfT, JsonDeserializationContext context)
                throws JsonParseException {
            HashMap<String, String> data = new HashMap<String, String>();
            JsonArray list = json.getAsJsonArray();
            for (JsonElement e : list) {
                Set<Entry<String, JsonElement>> entries = e.getAsJsonObject()
                        .entrySet();
                for (Entry<String, JsonElement> entry : entries) {
                    data.put(entry.getKey(), entry.getValue().getAsString());
                }
            }
            return data;
        }
    }
}
莘睿
2023-03-14

你的JSON是有效的,但你的映射类是无效的(部分内容不匹配)。特别是,类的文件属性不能映射为映射

"files": [
    {
        "folder1": "file.txt"
    }, 
    {
        "folder1/folder2": "file.cfg"
    }
]

表示包含对象的数组,其中每个对象最好表示为贴图。所以本质上是一个地图列表。因此,您的Java对象应该是:

public class CFS {
    private List<Map<String, String>> files = new ArrayList<Map<String, String>>(
            4);
    private List<String> directories = new ArrayList<String>(4);

    // Constructors, setters/getters
}

请注意,我已经通过将属性设置为私有并添加getters/setters来纠正您的属性。使用上面定义的类,您的程序应该可以正常工作。

final Gson gson = new GsonBuilder().create();
final CFS results = gson.fromJson(json, CFS.class);
Assert.assertNotNull(results);
Assert.assertNotNull(results.getFiles());
System.out.println(results.getFiles());

生产:

[{folder1=file.txt}, {folder1/folder2=file.cfg}]

如果您发现自己需要保留当前的CFS结构,则需要手动将JSON解析到其中。

解念
2023-03-14

如果有人在Android Studio中获得此错误:

尝试两件事:

  1. 回滚到最后的工作条件。(如果使用VCS,则恢复)
  2. 内置选项清理项目和重建。(为我工作。)

我是相当新的Android。如果犯了任何错误,请原谅。欢迎建议:)

 类似资料:
  • 我的java代码 我的JSON 除id外,所有字段均为字符串 我的错误 18/11/26 18:02:55信息mapreduce。作业:任务Id:尝试_1543189350698_0010_m_000000_0,状态:失败错误:com。谷歌。格森。JsonSyntaxException:java。伊奥。EOFEException:com第1行第3列的输入结束。谷歌。格森。格森。fromJson(G

  • 问题内容: 我有以下课程: 而此代码应解析json: 哪里 JSON是: 我得到的错误是: 但是我不知道为什么,根据jsonlint,json是有效的。 我为什么会收到此错误的任何主意吗? 问题答案: 您的JSON有效-但您的映射类无效(部分不匹配)。特别是,无法将类的属性映射为给定JSON中的a。很难推荐一个备用的结构来存储数据而不会看到更大的样本,但是通常,在JSON结构和Java类之间进行映

  • 问题内容: 我有以下课程: 而此代码应解析json: 哪里 JSON是: 我得到的错误是: 但是我不知道为什么,根据jsonlint,json是有效的。 我为什么会收到此错误的任何主意吗? 问题答案: 您的JSON有效-但您的映射类无效(部分不匹配)。特别是,无法将类的属性映射为给定JSON中的a。很难推荐一种备用结构来存储数据而又不会看到较大的示例,但是通常在JSON结构与Java类之间进行映射

  • 应为BEGIN\u对象,但在第1行第1列为字符串请帮助我,我遇到此错误 我的列表提供了从解析的json创建对象的类。Java语言 我的JSON: 使用GSON解析JSON的MainActivity代码。。。。。 错误:应为BEGIN\u对象,但在第1行第1列为字符串

  • 我试图检索数据并在回收器视图中显示它们。我正在进行改装,提出获取请求...一切都很好,除了:它不会在回收器中显示数据,因为它说:“预期BEGIN_ARRAY但在第1行第2列BEGIN_OBJECT”。我还使用了JSON插件中的kotlin数据类文件,从响应中生成数据类。我不知道该怎么办,我被卡住了。. 以下是我的课程: ApiClient。kt ApiService.kt UserReposito