Библиотека GluonConnect REST отображает неанглийские символы в строке JSON - PullRequest
0 голосов
/ 02 июля 2019

У меня есть следующий метод, который извлекает строку JSON из удаленного REST API. Строка JSON содержит французские символы. Проблема в том, что французский текст в строке JSON искажен.

Я использую клиентскую библиотеку REST GluonConnect для извлечения строки JSON с удаленного сервера. Все хорошо, кроме поиска JSON с неанглийским текстом.

Вот мой метод:

public void retrieveJsonString() {
  // GluonConnect RestClient setup
  RestClient restClient = RestClient.create().host(this.host).path(this.path).queryParam("schema", this.schema).queryParam("uri", "/contactsform").method("GET");
  // GluonConnect GluonObservableObject setup
  GluonObservableObject<String> godp = DataProvider.retrieveObject(restClient.createObjectDataReader(String.class));
  // Add a listener to the GluonObservableObject
  godp.stateProperty().addListener(new InvalidationListener() {
    @Override
    public void invalidated(Observable arg0) {
      if (godp.getState().equals(ConnectState.SUCCEEDED)) {
        response.bind(godp.asString());
      }
    }
  });
}

Строка ключа: response.bind (godp.asString ()) . godp.AsString () возвращает искаженный текст. Например, слово «Médiateur» с акцентом é отображается как «Médiateur». Если я изменю строку на response.bind (godp.asString (Locale.FRANCE, null)) , то ничего не вернется.

Пожалуйста, что я делаю не так? Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 июля 2019

Большое спасибо за ваши предложения, я наконец-то заставил его работать, обойдя класс StringInputConverter в библиотеке GluonConnect.Я написал новый слегка измененный класс на основе класса StringInputConverter, как показано ниже:

public class MyCustomStringInputConverter extends InputStreamInputConverter<String> {

private static final Logger LOGGER = Logger.getLogger(StringInputConverter.class.getName());

@Override
public String read() {
  try (StringWriter stringWriter = new StringWriter()) {
    try (
      BufferedReader reader =
          new BufferedReader(new InputStreamReader(getInputStream(), Charset.forName("UTF-8")));
      BufferedWriter writer = new BufferedWriter(stringWriter)) {
    boolean firstWrite = true;
    String line;
    while ((line = reader.readLine()) != null) {
      if (firstWrite) {
        firstWrite = false;
      } else {
        writer.newLine();
      }
      writer.write(line);
    }
  }

  return stringWriter.toString();
  } catch (IOException ex) {
    LOGGER.log(Level.SEVERE, "La lecture du flux d'entrée à échoué.", ex);
    return null;
  }
 }

}

Все, что я сделал, это изменил BufferedReader (новый InputStreamReader (getInputStream ())) * на BufferedReader (новый InputStreamReader (getInputStream (), Charset.forName ("UTF-8"))) .

Затем я использовал мой метод retrieveJsonString следующим образом:

  public void retrieveJsonString() {

  // RestClient setup
  RestClient restClient =
    RestClient.create().host(this.host).path(this.path).queryParam("schema", this.schema)
        .queryParam("uri", "/contactsform").method("GET");


  MyCustomStringInputConverter converter = new MyCustomStringInputConverter();

  // GluonObservableObject setup
  GluonObservableObject<String> godp =
    DataProvider.retrieveObject(restClient.createObjectDataReader(converter));

  // Add a listener to the GluonObservableObject
  godp.stateProperty().addListener(new InvalidationListener() {
    @Override
    public void invalidated(Observable arg0) {
      if (godp.getState().equals(ConnectState.SUCCEEDED)) {
        response.bind(godp.asString()); 
      } else if (godp.getState().equals(ConnectState.FAILED)) {
        exceptionMsg.set(godp.getException().getMessage());
      }
      }
  });

}
...