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

时间:2015-05-12 21:37:26

标签: android json json.net gson deserialization

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

使用Newtonsoft JSON.NET我在JSON中序列化我的邮件,然后将其原样发送到尝试使用Gson转换回来的Android应用程序。

这是我的Message类:

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,每个C#编码约定properties in pascal case

我设法解决了Gson的案例敏感性问题 GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);

现在我的问题很简单:每当我发送包含"非英语"的消息时,以下行将失败并抛出com.google.gson.JsonSyntaxException: java.io.EOFException。字母。

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

其中message是非null非空字符串

例如:la vie est très belle(生活非常美好)

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

所以这里是stacktrace的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

注意:我测试了多条短信。除了带外国字母的人外,他们都工作了!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

当通过Android Studio上的调试器查看Android应用程序收到的JSON时,我看不出有什么问题:所有字母都是正确的,没有奇怪或缺少字符。

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

猜猜是什么?有效 !所以我想,知道Java字符串默认总是在UTF-8中编码,也许我实际从.NET应用程序通过Bluetooth发送的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.