GSON fromJson 无法反序列化包含外来字符的 -> 字符串



我正在通过Bluetooth从.NET应用程序向Android Java应用程序发送字符串消息。

使用Newtonsoft JSON.NET,我在JSON中序列化消息,并按原样将它们发送给Android应用程序,该应用程序试图用Gson将它们转换回。

这是我的消息类:

public final class Message {
private final String content;
private final String address;
private final long timeStamp;
private boolean isRead;
private boolean isSent;

public Message(final String content, final String address, final long timeStamp,
final boolean isSent, final boolean isRead) {
this.content = content;
this.address = address;
this.timeStamp = timeStamp;
this.isSent = isSent;
this.isRead = isRead;
}
public final String getContent() {
return this.content;
}
public final String getAddress() {
return this.address;
}
public final boolean isRead() {
return this.isRead;
}
public final boolean isSent() {
return this.isSent;
}
public final long getTimeStamp() {
return this.timeStamp;
}
}

正如你所看到的,这里没什么好看的。该类的.NET版本非常相似,其中没有getter,而是使用properties in pascal case作为C#编码约定。

我设法通过GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);

现在我的问题是straigforward:每当我发送包含"非英语"字母的消息时,下面的一行就会失败并抛出com.google.gson.JsonSyntaxException: java.io.EOFException

final Message msg = gson.fromJson(message, Message.class);

其中消息是非空字符串

示例:la vie est très belle(生活很美好)

这里的"入侵者"是法国口音è

这里是堆叠竞赛的logcat:

om.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 94
at com.google.gson.Gson.fromJson(Gson.java:820)
at com.google.gson.Gson.fromJson(Gson.java:775)
at com.google.gson.Gson.fromJson(Gson.java:724)
at com.google.gson.Gson.fromJson(Gson.java:696)
at mackosoft.almightymessage.MainActivity$10.onNewMessageArrived(MainActivity.java:257)
at mackosoft.almightymessage.bluetooth.module.events.BluetoothEventManager.notifyNewMessageArrived(BluetoothEventManager.java:77)
at mackosoft.almightymessage.bluetooth.module.BluetoothManager$2.run(BluetoothManager.java:180)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.io.EOFException: End of input at line 1 column 94
at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1414)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:486)
at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:418)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:190)
at com.google.gson.Gson.fromJson(Gson.java:810)
            at com.google.gson.Gson.fromJson(Gson.java:775)
            at com.google.gson.Gson.fromJson(Gson.java:724)
            at com.google.gson.Gson.fromJson(Gson.java:696)
            at mackosoft.almightymessage.MainActivity$10.onNewMessageArrived(MainActivity.java:257)
            at mackosoft.almightymessage.bluetooth.module.events.BluetoothEventManager.notifyNewMessageArrived(BluetoothEventManager.java:77)
            at mackosoft.almightymessage.bluetooth.module.BluetoothManager$2.run(BluetoothManager.java:180)
            at java.lang.Thread.run(Thread.java:818)

注意:我确保所有的数据通过蓝牙传输回&我的.NET应用程序和Android应用程序之间的第四个代码是UTF-8

注二:我测试了多条短信。除了那个写着外国信件的人,他们都工作了!

我找到了解决方案。

当我看到Android应用程序通过Android Studio上的调试器接收到的JSON时,我没有发现任何错误:所有字母都是正确的,没有奇怪或缺失的字符。

因此,我手动复制了JSON,并用Gson创建了一个快速的Java Application,看看它是否会因相同类型的JSON内容而失败。

你猜怎么着?成功了!所以我想,知道Java字符串在默认情况下总是用UTF-8编码,也许我实际上通过Bluetooth从.NET应用程序发送的JSON不是?

我的.NET Windows Store App使用DataWriterOutputStream上写入数据。我用的是DataWriter.WriteString(string json)。我把它改成了DataWriter.WriteBytes(System.Text.Encoding.UTF8.GetBytes(string json)),它成功了!

就这样,问题解决了!

奇怪的是,DataWriter.WriteString没有告诉我它使用了什么编码,以及我是否可以更改它。文档只说明:Writes a string value to the output stream.

相关内容

  • 没有找到相关文章

最新更新