将InputStream转换为JSONObject

55
我使用以下代码将 InputStream 转换为 JSONObject。我的问题是,是否有简单的方法将 InputStream 转换为 JSONObject,而无需执行 InputStream -> BufferedReader -> StringBuilder -> loop -> JSONObject.toString() 的步骤?
我正在寻找一种更简便的方法将 InputStream 直接转换为 JSONObject。
    InputStream inputStreamObject = PositionKeeperRequestTest.class.getResourceAsStream(jsonFileName);
    BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputStreamObject, "UTF-8"));
    StringBuilder responseStrBuilder = new StringBuilder();

    String inputStr;
    while ((inputStr = streamReader.readLine()) != null)
        responseStrBuilder.append(inputStr);

    JSONObject jsonObject = new JSONObject(responseStrBuilder.toString());

你现在的代码很好。你可以把读取 BufferedReader 的部分提取出来,写成一个静态辅助方法并进行重复使用。有一些第三方库已经这样做了。 - Sotirios Delimanolis
14个回答

39

由于您已经在使用Google的Json-Simple库,您可以像这样从InputStream解析json:

InputStream inputStream = ... //Read from a file, or a HttpRequest, or whatever.
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject)jsonParser.parse(
      new InputStreamReader(inputStream, "UTF-8"));

5
不知道为什么,这段代码会抛出一个异常:Exception in thread "main" java.lang.ClassCastException: class org.json.simple.JSONArray cannot be cast to class org.json.JSONObject (org.json.simple.JSONArray和org.json.JSONObject在加载器'app'的未命名模块中)。 - Vinci
这应该是 JsonParser 而不是 JSONParser 吗? - klutt

17

4
这应该是被接受的答案……链接中的代码非常简单:JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));请注意,这行代码用于读取UTF-8编码的JSON数据。 - JoelFan
8
这几乎是一个仅包含链接的回答。如果您在答案中包含要点,效果会更好。 - Aleks G

10
这段代码可运行。
BufferedReader bR = new BufferedReader(  new InputStreamReader(inputStream));
String line = "";

StringBuilder responseStrBuilder = new StringBuilder();
while((line =  bR.readLine()) != null){

    responseStrBuilder.append(line);
}
inputStream.close();

JSONObject result= new JSONObject(responseStrBuilder.toString());       

10

如果你不想使用现成的库,你可以像这样制作一个类。

public class JsonConverter {

//Your class here, or you can define it in the constructor
Class requestclass = PositionKeeperRequestTest.class;

//Filename
String jsonFileName;

//constructor
public myJson(String jsonFileName){
    this.jsonFileName = jsonFileName;
}


//Returns a json object from an input stream
private JSONObject getJsonObject(){

    //Create input stream
    InputStream inputStreamObject = getRequestclass().getResourceAsStream(jsonFileName);

   try {
       BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputStreamObject, "UTF-8"));
       StringBuilder responseStrBuilder = new StringBuilder();

       String inputStr;
       while ((inputStr = streamReader.readLine()) != null)
           responseStrBuilder.append(inputStr);

       JSONObject jsonObject = new JSONObject(responseStrBuilder.toString());

       //returns the json object
       return jsonObject;

   } catch (IOException e) {
       e.printStackTrace();
   } catch (JSONException e) {
       e.printStackTrace();
   }

    //if something went wrong, return null
    return null;
}

private Class getRequestclass(){
    return requestclass;
}
}

然后,您可以像这样使用它:

JSONObject jObject = new JsonConverter(FILE_NAME).getJsonObject();

2
我认为最好的解决方案是将InputStream封装在JSONTokener对象中。 像这样: ```JSONTokener jsonParser = new JSONTokener(inputStream);```
JSONObject jsonObject = new JSONObject(new JSONTokener(inputStream));

你的意思是什么?如果要使用JSONTokener,你必须添加java-json依赖项(同样适用于JSONObject,这是本问题的主题...) - Daniele Zagnoni
8
AndroidжҰ†жһ¶и‡Ғеё¦зљ„JSONTokenerжһ„йЂ е‡Ңж•°еЏҒжҺӨ收Stringз±»еһ‹еЏ‚ж•°пәЊдёҚж”ҮжЊЃInputStreamз±»еһ‹еЏ‚ж•°гЂ‚ - friederbluemle

2
你可以使用这个API https://code.google.com/p/google-gson/。它简单易用且非常实用。

下面是如何使用https://code.google.com/p/google-gson/ API来解决你的问题。
public class Test {
  public static void main(String... strings) throws FileNotFoundException  {
    Reader reader = new FileReader(new File("<fullPath>/json.js"));
    JsonElement elem = new JsonParser().parse(reader);
    Gson gson  = new GsonBuilder().create();
   TestObject o = gson.fromJson(elem, TestObject.class);
   System.out.println(o);
  }


}

class TestObject{
  public String fName;
  public String lName;
  public String toString() {
    return fName +" "+lName;
  }
}


json.js文件内容:

{"fName":"Mohamed",
"lName":"Ali"
}

1
这并没有回答问题。请具体说明Gson是如何解决他们的问题的。 - Sotirios Delimanolis
此外,如果提问者正在使用的库已经提供了解决方案,请尝试使用该库来解决问题。如果没有,那么请表明不要给出基本上是“使用另一个库”的答案,然后发布库的链接。答案需要解释它们所关联的链接,而不仅仅是链接转储。 - zero298

1
简单解决方案:
JsonElement element = new JsonParser().parse(new InputStreamReader(inputStream));
JSONObject jsonObject = new JSONObject(element.getAsJsonObject().toString());

4
JsonParser不可用。 - Gabor

1
这对我起作用了:

JSONArray jsonarr = (JSONArray) new JSONParser().parse(new InputStreamReader(Nameofclass.class.getResourceAsStream(pathToJSONFile)));
JSONObject jsonobj = (JSONObject) new JSONParser().parse(new InputStreamReader(Nameofclass.class.getResourceAsStream(pathToJSONFile)));

1
请在您的回答中提供一些上下文,特别是它正在做什么以及为什么它解决了问题。 - haxxxton

1
利用Jackson JSON解析器。
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> map = mapper.readValue(inputStreamObject,Map.class);

如果你需要一个特定的JSONObject,那么你可以将map转换为JSONObject。

JSONObject json = new JSONObject(map);

参考此链接了解JSONObject构造函数的用法http://stleary.github.io/JSON-java/index.html


1
这里有一个解决方案,它不使用循环,只使用Android API:
InputStream inputStreamObject = PositionKeeperRequestTest.class.getResourceAsStream(jsonFileName);
byte[] data = new byte[inputStreamObject.available()];
if(inputStreamObject.read(data) == data.length) {
    JSONObject jsonObject = new JSONObject(new String(data));
}

获取字符串的代码如下:BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); String targetLcl = response.toString(); - CodeToLife

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