Java 接收不带'的JSON\0';
我必须将我的应用程序与现有(不可修改)Python脚本集成,该脚本发送JSON消息时不带“\0”或任何其他“消息结束”字符。有没有更好的方法来处理传入的消息,只需从套接字中一个字节接一个字节地读取数据并计算括号?在此应用程序中,由于协议原因,在消息内容中发送Java 接收不带'的JSON\0';,java,json,Java,Json,我必须将我的应用程序与现有(不可修改)Python脚本集成,该脚本发送JSON消息时不带“\0”或任何其他“消息结束”字符。有没有更好的方法来处理传入的消息,只需从套接字中一个字节接一个字节地读取数据并计算括号?在此应用程序中,由于协议原因,在消息内容中发送{或}是非法的,因此此代码工作正常,但在我看来很难看: int i = 0; int brackets = 0; byte[] msg = new byte[4096]; do { byte chunk =
{
或}
是非法的,因此此代码工作正常,但在我看来很难看:
int i = 0;
int brackets = 0;
byte[] msg = new byte[4096];
do
{
byte chunk = reader.readByte();
msg[i++] = chunk;
if (chunk == 123) // check if '{'
brackets++;
else if (chunk == 125) // check if '}'
brackets--;
} while ( brackets > 0);
byte[] finalMsg = Arrays.copyOfRange(msg, 0, i);
编辑Python代码:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((server_ip, server_port))
logging.info('Connected to: %s', (server_ip, server_port))
s.send(json.dumps(data))
logging.info('Sent message: %s', json.dumps(data))
我使用字节分析文本,因为这个脚本将每个字符作为一个字节发送,据我所知,char
在Java中有2个字节长。当我尝试一个字符接一个字符地接收数据时,我无法将它们与{
和}
进行比较,您可以使用库:
其中,
reader
是套接字读取器的输入流。为什么要用字节数组处理文本?Python脚本如何“发送”JSON消息?我们需要更多的信息。@Yob还有,那个用计数括号的黑客根本不起作用。原因如下:{a:1,b:'}}
@Yob抱歉,我错过了“不可修改”部分。好吧,至少这是一个教训。更“优雅”的是编写自己的真正的(-ish)JSON解析器,至少是一个处理字符串和嵌套对象的解析器。如果你没有时间的话,你可以调查一下吗?我似乎记得,该工具使构建快速递归下降解析器成为可能。@Yob根据您对Java中char
大小的判断是正确的。它们将字符列为16位Unicode字符
。Java在内部使用2字节字符,但要在这些字符和C样式的1字节字符字符串之间转换,通常应使用UTF8。
Gson gson = new Gson();
JsonReader jr = new JsonReader(reader);
String msg1 = gson.toJson(gson.fromJson(jr, Object.class));
String msg2 = gson.toJson(gson.fromJson(jr, Object.class));
...