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 输入流的主要内容,如果未能解决你的问题,请参考以下文章

java题 任选一个文件,使用文件输入流,将其数据读取出来,并打印到控制台!! 代码简单能够有注释

java 读取输入流的时候cpu占用很高,怎么解决

java流

java流

Java 之 字节输入流 [InputStream]

java 文件流 输入流 输出流