2015-05-12 3 views
0

Я отправляю строковые сообщения из приложения .NET через Bluetooth в приложение Java Java.GSON fromJson не может десериализовать -> строки, содержащие иностранные символы

Использование 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 этого класса довольно похожа, где вместо геттеров есть properties in pascal case в качестве условных обозначений C#.

мне удалось решить прецедентную чувствительность Gson через GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);

Теперь моя проблема straigforward: следующая строка будет прервана и бросить com.google.gson.JsonSyntaxException: java.io.EOFException всякий раз, когда я отправляю сообщение, содержащее «не английскую» букву.

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

где сообщение является ненулевым не пустой строкой

Exemple: la vie est très belle (жизнь очень красиво)

«злоумышленник» здесь является французским акцентом è.

Так вот LogCat из StackTrace:

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) 

Примечание: Я сделал, что все данные, передаваемые через Bluetooth назад & вперед между моей .NET приложения и Android приложение кодируется в UTF-8.

Примечание: Я проверил несколько текстовых сообщений. Все они работали, кроме одного с иностранными письмами!

ответ

0

Я нашел решение.

При взгляде на JSON, полученном приложением Android через отладчик на Android Studio, я не мог видеть что-то не так: все буквы были правильными, а не странными или отсутствующими символами.

Итак, я вручную скопировал JSON и создал быстрый Java Application с Gson, чтобы узнать, не сработает ли он с таким же содержимым JSON.

Угадайте, что? Это сработало ! Поэтому я подумал, зная, что строки Java по умолчанию всегда кодируются в UTF-8, возможно, JSON, который я действительно отправляю из приложения .NET через Bluetooth, нет?

My .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.

Смежные вопросы