我有一个用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没有添加到字符串中?
答案 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个字节。
我认为有两个原因可能是导致这种情况的原因。
gson阅读器没有接收您要发送的“byte []”类型,并且它将您的二进制文件视为UTF-8编码的字符串。
JSON.NET字节数组的解释方式与gson的解释方式不同 - 所以如果不编写JSON.NET兼容的解串器,它就无法工作
我认为你需要继续查看数据,尝试更改编码,并且看看你是否可以获得一个java的gson解析器,它可以让你获得更多的控制权,然后这个就行了:)