如何parsingJSONinputstream

我正在使用java调用一个返回JSON对象的url:

url = new URL("my URl"); urlInputStream = url.openConnection().getInputStream(); 

如何将响应转换为stringforms并parsing它?

我build议你必须使用Reader来转换你的InputStream。

 BufferedReader streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8")); StringBuilder responseStrBuilder = new StringBuilder(); String inputStr; while ((inputStr = streamReader.readLine()) != null) responseStrBuilder.append(inputStr); new JSONObject(responseStrBuilder.toString()); 

我试过in.toString(),但它返回:

 getClass().getName() + '@' + Integer.toHexString(hashCode()) 

(就像文档说的那样,它从Object中派生到toString)

所有当前的答案都假设把整个JSON拉到内存中是可以的,因为InputStream的好处在于你可以一点点读取input。 如果你想避免一次阅读整个Json文件,那么我会build议使用jackson库(这是我个人最喜欢的,但我相信像Gson的其他人也有类似的function)。

有了jackson,您可以使用JsonParser一次读取一个部分。 下面是我写的一个代码示例,它包装了一个Iterator中的JsonObjects数组的读取。 如果您只想查看Jackson的示例,请查看initJsonParser,initFirstElement和initNextObject方法。

 public class JsonObjectIterator implements Iterator<Map<String, Object>>, Closeable { private static final Logger LOG = LoggerFactory.getLogger(JsonObjectIterator.class); private final InputStream inputStream; private JsonParser jsonParser; private boolean isInitialized; private Map<String, Object> nextObject; public JsonObjectIterator(final InputStream inputStream) { this.inputStream = inputStream; this.isInitialized = false; this.nextObject = null; } private void init() { this.initJsonParser(); this.initFirstElement(); this.isInitialized = true; } private void initJsonParser() { final ObjectMapper objectMapper = new ObjectMapper(); final JsonFactory jsonFactory = objectMapper.getFactory(); try { this.jsonParser = jsonFactory.createParser(inputStream); } catch (final IOException e) { LOG.error("There was a problem setting up the JsonParser: " + e.getMessage(), e); throw new RuntimeException("There was a problem setting up the JsonParser: " + e.getMessage(), e); } } private void initFirstElement() { try { // Check that the first element is the start of an array final JsonToken arrayStartToken = this.jsonParser.nextToken(); if (arrayStartToken != JsonToken.START_ARRAY) { throw new IllegalStateException("The first element of the Json structure was expected to be a start array token, but it was: " + arrayStartToken); } // Initialize the first object this.initNextObject(); } catch (final Exception e) { LOG.error("There was a problem initializing the first element of the Json Structure: " + e.getMessage(), e); throw new RuntimeException("There was a problem initializing the first element of the Json Structure: " + e.getMessage(), e); } } private void initNextObject() { try { final JsonToken nextToken = this.jsonParser.nextToken(); // Check for the end of the array which will mean we're done if (nextToken == JsonToken.END_ARRAY) { this.nextObject = null; return; } // Make sure the next token is the start of an object if (nextToken != JsonToken.START_OBJECT) { throw new IllegalStateException("The next token of Json structure was expected to be a start object token, but it was: " + nextToken); } // Get the next product and make sure it's not null this.nextObject = this.jsonParser.readValueAs(new TypeReference<Map<String, Object>>() { }); if (this.nextObject == null) { throw new IllegalStateException("The next parsed object of the Json structure was null"); } } catch (final Exception e) { LOG.error("There was a problem initializing the next Object: " + e.getMessage(), e); throw new RuntimeException("There was a problem initializing the next Object: " + e.getMessage(), e); } } @Override public boolean hasNext() { if (!this.isInitialized) { this.init(); } return this.nextObject != null; } @Override public Map<String, Object> next() { // This method will return the current object and initialize the next object so hasNext will always have knowledge of the current state // Makes sure we're initialized first if (!this.isInitialized) { this.init(); } // Store the current next object for return final Map<String, Object> currentNextObject = this.nextObject; // Initialize the next object this.initNextObject(); return currentNextObject; } @Override public void close() throws IOException { IOUtils.closeQuietly(this.jsonParser); IOUtils.closeQuietly(this.inputStream); } } 

如果你不关心内存使用情况,那么阅读整个文件并将其parsing为其他答案中提到的一个大Json就更容易了。

使用jackson将jsoninputstream转换为地图或对象http://jackson.codehaus.org/

还有一些其他有用的JSON库,你可以谷歌:JSON的Java

对于那些指出你不能像这样使用InputStream的toString方法的事实,请参阅https://stackoverflow.com/a/5445161/1304830

那么我的正确答案是:

 import org.json.JSONObject; public static String convertStreamToString(java.io.InputStream is) { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } ... JSONObject json = new JSONObject(convertStreamToString(url.openStream()); 

使用图书馆。

  • GSON
  • jackson
  • 或者其他许多JSON库中的一个。

如果你喜欢使用Jackson Databind ( Spring默认使用它的HttpMessageConverters ),那么你可以使用ObjectMapper.readTree(InputStream) API。 例如,

 ObjectMapper mapper = new ObjectMapper(); JsonNode json = mapper.readTree(myInputStream); 
 { InputStream is = HTTPClient.get(url); InputStreamReader reader = new InputStreamReader(is); JSONTokener tokenizer = new JSONTokener(reader); JSONObject jsonObject = new JSONObject(tokenizer); }