我试图解析一些JSON。这是代码。 frc-manual.usfirst.org/a/GetAllItems/ManualID=3我已经尝试了几个小时才能使它工作但我在网上看到的每个例子都使用getJSONObject(int)但我只能使用getJSONObject(String)。这是不可能的。我忽略了什么吗?
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.annotation.SuppressLint;
public class JSON {
private String html = "html";
private String version = "version";
private String pageString = null;
private String urlString = "http://frc-manual.usfirst.org/a/GetAllItems/ManualID=3";
public volatile boolean parsingComplete = true;
public JSON(String page){
this.pageString = page;
}
public String getHTML(){
return html;
}
public String getVersion(){
return version;
}
@SuppressLint("NewApi")
public void readAndParseJSON(String in) {
try {
JSONObject reader = new JSONObject(in);
JSONObject head = reader.getJSONObject("data").getJSONObject("SubChapter").getJSONObject("3").getJSONObject("children").getJSONObject(pageString);
if(head != null){
html = head.getString("item_content_text");
html = html + head.length();
for(int i = 0; i < head.length();i++){
JSONObject children = head.getJSONObject(i);
if(children != null){
html = html + children.getString("item_content_text");
}
}
}
//html = html + listFromJsonSorted(head.getJSONObject("children"));
JSONObject main = reader.getJSONObject("data");
version = main.getString("LatestManualUpdate");
parsingComplete = false;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void fetchJSON(){
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();
String data = convertStreamToString(stream);
readAndParseJSON(data);
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
}
答案 0 :(得分:1)
您在此示例中看到的可能是JSONArray。
JSONArray arr = json.getJSONArray("array");
JSONObject obj = arr.getJSONObject(0);
在您的情况下,我没有看到此JSON中的任何数组,代码中的 head 是JSONObject。要获取item_content_text,您只需要head.getString("item_content_text");
你可以这样做以获得JSON中的所有孩子:
html = head.getString("item_content_text");
JSONObject children = head;
while (children.containsKey("children")) {
children = children.getJSONObject("children");
html += children.getString("item_content_text");
}
答案 1 :(得分:0)
您只能使用getJSONObject(String)
而不是getJSONObject(int)
,因为该方法只接受字符串..检查documentation here ..
原因是因为json中的键只是字符串.. read here
我认为你正在寻找从json中检索一个int值,但你感到困惑..如果json确实有一个带有int值的键,那么这样做的方法就是getInt("key_name")
。
答案 2 :(得分:0)
当然,你可以,只是因为我认为你的&#34; head&#34;变量应该具有返回类型JSONArray而不是JSONObject。
我在程序中运行此代码 -
//response = some http response
final JSONObject object = new JSONObject(response);
final JSONArray array = object.getJSONArray("repeatedStuff"); //$NON-NLS-1$
Assert.assertEquals(2, array.length());
for (int i = 0; i < array.length(); i++) {
final JSONObject element = array.getJSONObject(i);
//do something
}
您也可以参考此链接查看他们正在做的事情 - android: The method getJSONObject(int) in the type JSONArray is not applicable for the arguments (String)
如果有帮助,请告诉我!
答案 3 :(得分:0)
您已在代码中的任何地方使用了 JSONObject 。因此,您只能在getJSONObject()中传递字符串参数。 我建议您将其更改为 JSONArray ,然后将能够在getJSONObject()中传递int参数。