Gson反序列化错误:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但是是STRING

时间:2014-03-10 06:16:30

标签: java api architecture deserialization gson

我已经看过很多关于这个主题的问题,但似乎找不到解决我问题的方法。

我收到了反序列化错误:

  

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:   预计BEGIN_OBJECT但在STRING第1栏第3384行

特别是反序列化我的RoutingTable clas时,decerialization非常适合其他所有东西。我在这里上传了序列化的json数据:http://jsonfiddle.net/bx0ga

要序列化的类:

public class RoutingTable
{
    private transient final Node localNode;  // The current node
    private final KadBucket[] buckets;


    {
        buckets = new KadBucket[NodeId.ID_LENGTH];
    }
    // Methods....
}

KadBucket课程:

public class KadBucket implements Bucket
{
    private final int depth;
    private final Map<NodeId, Node> nodes;

    {
        nodes = new HashMap<>();
    }
    // methods and so on
}

序列化代码:我有一个序列化类,使用泛型来处理序列化:

public class JsonSerializer<T> implements KadSerializer<T>
{
    private final Gson gson;
    {
        gson = new Gson();
    }

    @Override
    public void write(T data, DataOutputStream out) throws IOException
    {
        try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(out)))
        {
            writer.beginArray();

            /* Store the content type */
            gson.toJson(data.getClass().getName(), String.class, writer);

            /* Now Store the content */
            gson.toJson(data, data.getClass(), writer);

            writer.endArray();
        }
    }

    @Override
    public T read(DataInputStream in) throws IOException, ClassNotFoundException
    {
        try (DataInputStream din = new DataInputStream(in);
                JsonReader reader = new JsonReader(new InputStreamReader(in)))
        {
            reader.beginArray();

            /* Read the class name */
            String className = gson.fromJson(reader, String.class);

            /* Read and return the Content*/
            return gson.fromJson(reader, Class.forName(className));
        }
    }
}

因此,对于序列化,我这样做:

// Writing to dout which is an output stream
new JsonSerializer<RoutingTable>().write(this.localNode.getRoutingTable(), dout);

// Reading from din which is an input stream
RoutingTable irtbl = new JsonSerializer<RoutingTable>().read(din);

除了路由表之外,使用它对系统中的每个其他类都非常有效。

2 个答案:

答案 0 :(得分:0)

RoutingTable包含瞬态的类变量,用于表示不应序列化字段。

答案 1 :(得分:0)

对我而言,您的输入似乎不是JSON对象。也曾经发生过一次,但我不记得究竟是什么问题,但我想这是因为开始时的空间。 查看为反序列化提供的原始输入,并将其转换为适当的json对象。