2015-05-12 113 views
0

我通過Bluetooth將.NET應用程序的字符串消息發送到Android Java應用程序。json的GSON無法反序列化 - >包含外來字符的字符串

使用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,每個C#編碼約定有properties in pascal case

我設法通過 GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);

現在我的問題是straigforward解決GSON的情況下,靈敏度:下面一行將失敗,並拋出一個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進行編碼。

注意二:我測試了多條短信。除了外國信件外,他們都在工作!

回答

0

我找到了解決方案。

當通過Android Studio上的調試器查看Android應用程序接收到的JSON時,我看不到錯誤:所有字母都是正確的,沒有奇怪或缺少字符。

因此,我手動複製了JSON,並創建了一個快速Java ApplicationGson,以查看它是否會以相同類型的JSON內容失敗。

猜猜是什麼?有效 !所以我想,知道Java字符串默認情況下始終編碼在UTF-8,也許我實際從.NET應用程序通過Bluetooth發送的JSON不是?

我的.NET Windows Store App使用DataWriter將數據寫入OutputStream。 我正在使用DataWriter.WriteString(string json)。我改變它爲DataWriter.WriteBytes(System.Text.Encoding.UTF8.GetBytes(string json)),它的工作!

就這樣,問題解決了!

很奇怪DataWriter.WriteString不能告訴它使用什麼編碼,如果我可以改變它。該文件僅指出:Writes a string value to the output stream.

相關問題