Java 读取 JSON 输入流
Posted
技术标签:
【中文标题】Java 读取 JSON 输入流【英文标题】:Java read JSON input stream 【发布时间】:2014-12-04 17:42:25 【问题描述】:我正在用 Java 编写一个简单的 TCP 服务器,它正在侦听某个端口上的某个 URL。一些客户端(不是 Java)向服务器发送 JSON 消息,类似于 'message':'hello world!', 'test':555
。我接受消息并尝试获取 JSON(我正在考虑使用 GSON 库)。
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
但是我怎样才能从输入流中获取消息呢?我尝试使用ObjectInputStream
,但据我了解,它等待序列化数据并且 JSON 没有序列化。
【问题讨论】:
JSON 是一个字符串,直到您使用库将其解码为 java 对象 【参考方案1】:用BufferedReader
包装它并开始从中读取数据:
StringBuilder sb = new StringBuilder();
try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())))
String line;
while ( (line = br.readLine()) != null)
sb.append(line).append(System.lineSeparator());
String content = sb.toString();
//as example, you can see the content in console output
System.out.println(content);
将其作为字符串后,使用 Gson 或 Jackson 之类的库对其进行解析。
【讨论】:
我觉得您的代码可能会引入部分读取或单次读取多条消息的问题。你能验证一下吗【参考方案2】: StringBuffer buffer = new StringBuffer();
int ch;
boolean run = true;
try
while(run)
ch = reader.read();
if(ch == -1) break;
buffer.append((char) ch);
if(isJSONValid(buffer.toString())) run = false;
catch (SocketTimeoutException e)
//handle exception
private boolean isJSONValid(String test)
try
new JSONObject(test);
catch (JSONException ex)
try
new JSONArray(test);
catch (JSONException ex1)
return false;
return true;
【讨论】:
以上是关于Java 读取 JSON 输入流的主要内容,如果未能解决你的问题,请参考以下文章