无法使用Gson反序列化byte []

时间:2012-08-24 12:37:06

标签: c# java json json.net gson

我有一个用Java编写的类和用C#编写的同一个类。我正在将C#类序列化为json字符串,我试图在Java端反序列化它。 这一切都很顺利,直到我为这两个类添加了一个byte []字段。 这是类定义: C#:

public class RegisterRequest : GenericRequest
{
    public string name { set; get; }
    public string sex { set; get; }
    public string birthday { set; get; }
    public string from { set; get; }
    public string about { set; get; }
    public byte[] image { set; get; }
}

爪哇:

public class RegisterRequest extends GenericRequest{
    private String name;
    private String sex;
    private String birthday;
    private String from;
    private String about;
    private String pictureUrl;
    private byte[] image;
}

C#端的序列化使用:request.ToJson()(Json.NET) Java反序列化使用:RegisterRequest rr = gsonObject.fromJson(msg, RegisterRequest.class);(使用Gson .msg是json字符串)

当我不在字节数组中发送任何内容时,它仍然有效。但是当我填充数组时,我在Java端获得了一个例外:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 159089

我猜测需要有一些东西可以标记Gson识别的数组的开头但是Json.NET没有添加到字符串中?

2 个答案:

答案 0 :(得分:2)

鉴于上述评论的输入内容

"image":"/9j/4AAQSkZJRgAB..."

并查看Gson如何序列化byte[]

"a":[96,-76,32,-69,56,81,-39,-44...

答案显而易见:Gson使用json数组,而json.net使用json字符串。你必须改变一个或另一个。为gson编写自定义序列化器很容易(虽然我从未尝试使用byte[]),但同样可能适用于其他工具。

答案 1 :(得分:-1)

好的,这是一个很酷的问题 - 我会继续尝试回答这个问题,因为评论的篇幅很长。

首先,问题是您在阅读数据时的解析器。它在二进制有效负载上被欺骗并遇到非法的字符异常。这是因为它试图处理一个大的ByteArray,但遇到一个它无法处理的字符或字节(可能是因为二进制文件中有一个字节无法转换为UTF-8。另外,请记住字符是通常在C#中为1个字节,在java中也为2个字节。

我认为有两个原因可能是导致这种情况的原因。

  1. gson阅读器没有接收您要发送的“byte []”类型,并且它将您的二进制文件视为UTF-8编码的字符串。

  2. JSON.NET字节数组的解释方式与gson的解释方式不同 - 所以如果不编写JSON.NET兼容的解串器,它就无法工作

  3. 我认为你需要继续查看数据,尝试更改编码,并且看看你是否可以获得一个java的gson解析器,它可以让你获得更多的控制权,然后这个就行了:)