2017-04-11 46 views
-1

我得到下面的JSON从网址:读取多个JSON行

{"bytes": 5043, "name": "a", "timestamp": "11-Apr-2017 12:11:51", "ds": "Lab1"} 
{"bytes": 0, "name": "b", "timestamp": "11-Apr-2017 12:11:51", "ds": "Lab1"} 
{"bytes": 11590, "name": "c", "timestamp": "11-Apr-2017 12:11:51", "ds": "Lab1"} 

我要回字节的每一行。使用杰克逊我试图解析它如下(注:JSON是保存到文件用于测试):

package JsonRead; 

import java.io.File; 
import java.io.IOException; 

import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonTreeModelLogStorage { 
    public static void main(String[] args) { 

     try{ 

      ObjectMapper mapper = new ObjectMapper(); 

      JsonNode root = mapper.readTree(new File("JsonRead/json2.json")); 

      JsonNode logStorageNode = root; 

      for(JsonNode node : logStorageNode){ 
       String bytesUsed = node.path("bytes").asText(); 
       System.out.println("Bytes Used: " + bytesUsed); 
      } 

     } catch(IOException e){ 
       System.out.println("IO Exception " + e); 
     } 
    } 
} 

这将返回以下:

Bytes Used: 
Bytes Used: 
Bytes Used: 
Bytes Used: 

如果我再改我的for循环的以下我可以看到我正在返回json的第一行:

for(JsonNode node : logStorageNode){ 
      String json = node.asText(); 
      System.out.println("json: " + a); 
} 

如何实现json所有行的字节?

+2

您发布的JSON无效:JSON规范不允许像这样并排多个对象。我想你正在接收一个数组?如果是这样,那肯定是你的问题:你应该将'root'作为'JsonArray'而不是'JsonNode'处理并且对其内容进行循环 – Aaron

回答

0

谢谢你们。这是一个很大的帮助。

为了适合我的需要,我编辑了一下这个尝试。以下是我最终得到的结果:

ObjectMapper mapper = new ObjectMapper(); 
    try(
      FileReader reader = new FileReader("JsonRead/json2.json"); 
      BufferedReader bufferedReader = new BufferedReader(reader); 
     ) { 
      String currentLine; 
      while((currentLine=bufferedReader.readLine()) != null) { 
       Vault vlt = mapper.readValue(currentLine, Vault.class); 
       System.out.println(vlt.getBytes()); 
      } 
     } 
2

您发布的内容无效JSON:JSON规范不允许像这样并排多个对象。

如果您遇到这样的文本(它不能被视为JSON),您需要将它分割为一个分隔符,以便每个子字符串都是您将能够解析的有效JSON对象。
在你的情况,看起来换行是一个有效的分隔符,但你应该确保你的JSON对象永远不会包含任何换行符。如果是这样的话,你可以按照如下解析文本:

try(
    FileReader reader = new FileReader("JsonRead/json2.json"); 
    BufferedReader bufferedReader = new BufferedReader(reader); 
) { 
    String currentLine; 
    while((currentLine=bufferedReader.readLine()) != null) { 
     JsonNode logStorageNode = mapper.readTree(currentLine); 
     // [...] carry on with your current code. 
    } 
} 

我先假设你正在接受一个数组来代替:

[ 
    {"bytes": 5043, "name": "a", "timestamp": "11-Apr-2017 12:11:51", "ds": "Lab1"}, 
    {"bytes": 0, "name": "b", "timestamp": "11-Apr-2017 12:11:51", "ds": "Lab1"}, 
    {"bytes": 11590, "name": "c", "timestamp": "11-Apr-2017 12:11:51", "ds": "Lab1"} 
] 

在这种情况下,你应该在它的内容循环:

JsonNode root = mapper.readTree(new File("JsonRead/json2.json")); 

if (!root.isArray()) { 
    throw WhateverException("A JSON Array is expected"); 
} 

// a cast to ArrayNode would be possible, but isn't necessary 
// as per the design of jackson's JsonNode 
Iterator<JsonNode> it = root.iterator(); 

while (it.hasNext()) { 
    JsonNode logStorageNode = it.next(); 

    // [...] carry on with your current code. 
} 
+0

这不是一个数组。它有可能返回一个包含json行的文本文件吗? – runnerpaul

+0

是的,这是可能的,但是然后文件内容不能被解析为单个JSON对象(并且响应的内容类型可能不是application/json)。如果文件的每一行都包含单个JSON对象,并且JSON对象本身不包含任何换行符,则可以遍历文件的各行并从它们每个的内容中解析JSON对象。我确认这一点,我会更新我的答案来处理这样的文件。 – Aaron

+0

啊,我从来没有想过检查响应类型。它是二进制/八位字节流。 每行确实包含换行符,例如: “{”bytes“:5043,”name“:”a“,”timestamp“:”2017年4月11日12:11:51“,”ds“:”Lab1 “} [\ n]” – runnerpaul