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

导入被JSON序列化的json失败

龙越彬
2023-03-14

所以我有一个带有一些字段的对象。。。

protected String name;
protected String relativePathAndFileName;
protected DateTime next_Run;
protected ArrayList<String> hosts;

将其序列化为JSON,如下所示:

public void serialize(){
    Gson gson = Converters.registerDateTime(new GsonBuilder()).setPrettyPrinting().create();
    String json = gson.toJson(this);

    try {
        FileWriter writer = new FileWriter(this.relativePathAndFileName);
        writer.write (json);
        writer.close();
    } catch (IOException e) {
        logger.error("Error while trying to write myAlert to json: ", e);
    }
}

稍后,当我需要读取这个json文件时,我尝试这样做:

try {
        for (File f : alertConfigFiles) {
            Gson gson = new Gson();
            JsonReader reader = new JsonReader(new FileReader(f));
            Type type = new TypeToken<Map<String, String>>(){}.getType();
            Map<String, String> myMap = gson.fromJson(reader, type);
            Alert tempAlert = new Alert(myMap);
            myAlerts.add(tempAlert);
            logger.debug("Imported: " + f.toString());
        }

我得到的错误是:

Unhandled exception when trying to import config files: 
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 28 column 13 path $.

文件中的JSON是大意如下的东西:

 {
 "name": "Logs Per Host - past 24 hours",
 "relativePathAndFileName": "./Elk-Reporting/Alerts/logs_per_host24h.json",
 "next_Run": "2017-06-07T22:24:56.682-04:00",
 "hosts": [
    "app-12c",
    "app1-18",
    "wp-01",
    "app-02",
    "wp-02",
    "cent-04",
    "app-06",
    "app-05"
  ]
  }

当它试图导入主机的ArrayList时,它似乎会窒息,但它能够毫无问题地将它们写出来。

有谁能给我一些建议,让我的导入工作没有问题吗?

共有2个答案

周承天
2023-03-14

这两条线似乎是问题所在:

Type type = new TypeToken<Map<String, String>>(){}.getType();
Map<String, String> myMap = gson.fromJson(reader, type);

序列化某个特定类的对象。然后将其反序列化为键入。但是你的JSON不适合地图。最好这样做,这样你就可以使用自己的类。

YourClass myMap = gson.fromJson(reader, YourClass.class);

如果想使用这种方法,可能需要将Java类更改为包含字符串数组,而不是字符串数组列表。

也许这一页对你有所帮助。尤其是第一个案例适合你的情况。

另一个选项是自定义反序列化程序,如下所述。

桑博远
2023-03-14

尽量保持简单。使用地图等等,是有问题的一种方式。下面是反序列化/序列化的工作代码:

package com.rizze.beans.labs.sof;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

import com.google.gson.Gson;

public class SOFGson {


    public String json = "{  \"name\": \"Logs Per Host - past 24 hours\", \"relativePathAndFileName\": \"./Elk-Reporting/Alerts/logs_per_host24h.json\", \"next_Run\": \"2017-06-07T22:24:56.682-04:00\", \"hosts\": [ \"bos-qa-app-12c\", \"bos-qa-app1-18\", \"bos-qa-wp-01\", \"bos-lt-app-02\", \"bos-qa-wp-02\", \"bos-dev-cent-04.americanwell.com\", \"bos-qa-app-06\", \"bos-qa-app-05\" ]}";

    public class MyObj{
        protected String name;
        protected String relativePathAndFileName;
        protected String next_Run;
        protected String[] hosts;
    }

    @Test
    public void test() {

        Gson gson = new Gson();
        MyObj obj = gson.fromJson(json, MyObj.class);
        assertTrue(obj!=null);
        assertTrue(obj.hosts.length==8);
        System.out.println(gson.toJson(obj));


    }

}

以下是课堂要点:https://gist.github.com/jeorfevre/7b32a96d4ddc4af68e40bf95f63f2c26

 类似资料:
  • 问题内容: 我在Web API项目中使用了Dictionary,该项目的序列化方式类似于JSON: 因为我有重复的键,所以我不能再使用Dictionary类型,而现在我正在使用 但这是以这种方式序列化的: 有没有办法像字典一样进行序列化? 谢谢。 问题答案: 如果您使用Newtonsoft Json.NET库,则可以执行以下操作。 定义一个转换器,以所需的方式写入键/值对的列表: 然后使用转换器:

  • 问题内容: 我想要一种尽可能自动地将对象序列化和反序列化为JSON的方法。 序列化: 对我来说,理想的方式是,如果我在实例JSONSerialize()中调用,它将返回带有JSON对象的字符串,该对象具有该对象的所有公共属性。对于那些原始值,这很简单,对于对象,它应该尝试调用每个JSONSerialize()或ToString()或类似的东西来递归序列化所有公共属性。对于集合,它也应该正确运行(只

  • 问题内容: 我正在使用python包pymongo从mongodb数据库中检索数据。 然后我转换为列表 这是print(l)返回的内容: 现在,我需要转换为JSON,以便可以对其进行操作。 我还尝试遵循 http://api.mongodb.org/python/1.7/api/pymongo/json_util.html 失败:编辑:链接的最新版本为http://api.mongodb.org/

  • 我想要一种将对象序列化和反序列化为JSON的方法,尽可能自动。 Serialize:对我来说,理想的方式是,如果我调用一个实例JSONSerialize(),它会返回一个带有JSON对象的字符串,该对象的所有公共属性都是< code >“name _ of _ property”:“value”。对于那些基本类型的值,这很简单,对于对象,它应该尝试在每个JSONSerialize()或ToStri

  • 问题内容: 我有一个WCF服务定义如下: 所述类的定义为: ILayoutService的实现如下: 我实现了,所以我可以得到将被(反)序列化的原义JSON。我正在使用它来测试通过jQuery调用此服务: 返回的布局是VB代码中调用返回的确切JSON 。出于某种原因,当我调用Web服务,输入参数在什么都不是。反序列化一定会失败。知道为什么吗? 问题答案: 仅凭您提供的细节很难分辨。 这是我的建议:

  • 我有以下ORM对象(简化): 每行有: 主键 插入行时的时间戳 computed_values要存储的实际JSONB数据 JSONB来存储计算数据的日期列表。 虽然我对列没有问题,但是对象不能被SQLAlchemy JSON序列化程序序列化。 我的想法是为该列重新定义对象的序列化程序行为。要做到这一点,我必须定义自己的自定义JSON序列化程序,或者使用一些现成的序列化程序,比如orjson。因为我