Java读取JSON输入流

6

我正在使用Java编写一个简单的TCP服务器,它在某个URL上监听某个端口。一些客户端(不是Java)向服务器发送JSON消息,类似于这样{'message':'hello world!', 'test':555}。我接受这条消息并尝试获取JSON(我打算使用GSON库)。

Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();

但是我该如何从输入流中获取消息呢?我尝试使用ObjectInputStream,但据我理解它只等待序列化数据,而 JSON 却不是序列化的。


JSON是一个字符串,直到您使用库将其解码为Java对象。 - scrappedcola
2个回答

7

使用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这样的库进行解析。


1
我觉得你的代码可能会引入部分读取或一次性读取多条消息的问题。你能否请验证一下? - Umar Tahir

0
        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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接