Отправка JSON от Python до Java - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь отправить JSON с Python клиента на Java сервер

Тип данных JSON - байты (в Python), и когда я его десериализую ( в Python) и распечатайте его, оно выглядит идеально. Сервер работает нормально, когда подключается клиент Java, а когда я десериализирую JSON и печатаю его в Java, он выглядит точно так же, как в Python и реальных JSON файлах. JSON все выглядит хорошо, но данные не принимаются сервером Java.

data = open(file_path, 'r').read() # reading JSON object as string
serialized_data = pickle.dumps(data)

s.send(serialized_data)

Когда я отправляю файл JSON, сервер Java подтверждает соединение, но JSON данные по любой причине не принимаются.

python output

Java Клиент

String sentence = new String(readFile());

if(!sentence.equals("fileNotFound")) {
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    oos.writeObject(sentence);
}

Java Сервер

ObjectInputStream inFromClient = new ObjectInputStream(socket.getInputStream());
String clientString = null;
try {
    clientString = (String) inFromClient.readObject();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
inFromClient.close();

1 Ответ

1 голос
/ 02 февраля 2020

Вы, кажется, делаете это:

  1. Считывание JSON из файла в виде строки
  2. Pickle-строка
  3. Отправка маринада на Java .

Это не сработает. Рассол имеет формат Python -specifi c. Java не понимает этого.

Данные, которые вы читаете из файла, уже сериализованы .... как JSON.

Решение: отправить строка, содержащая JSON без ее выборки.


С другой стороны, если Java сервер ожидает, что получит что-то, что было сериализовано с использованием ObjectOutputStream, тогда у вас есть большая проблема. Java Протокол сериализации объекта - Java, специфицированный c. Python не поддерживает это. Но если вы на самом деле отправляете JSON на сервер, вам нужно это сделать. Измените сервер так, чтобы он принимал JSON, и избавьтесь от кода ObjectInputStream / ObjectOutputStream с обеих сторон.


С третьей стороны, если вы не можете избавиться от ObjectInputStream / ObjectOutputStream, тогда, возможно, вам нужно изменить сторону сервера, чтобы либо предоставить отдельный API для python для вызова, либо заставить сервер проверить заголовок «content-type» запроса и обработать любую форму данных сериализация (JSON и протокол сериализации объектов)

...