2014-05-16 31 views
1

我想解析一些JSON。这是代码。 frc-manual.usfirst.org/a/GetAllItems/ManualID=3我一直在尝试几个小时才能正常工作,但我在网上看到的每个示例都使用getJSONObject(int),但我只能使用getJSONObject(String)。这是不可能的。我可以忽略一些东西吗使用getJSONObject(int)

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

您只能使用getJSONObject(String)getJSONObject(int),因为只需要字符串的方法。检查documentation here ..

的原因,是因为在JSON键总是字符串仅.. read here

我认为你正在寻找检索JSON的一个int值,但你糊涂了..这样做会getInt("key_name")如果JSON确实有int值一键的方式..

1

可能你在这个例子中看到的是一个JSONArray。

JSONArray arr = json.getJSONArray("array"); 
JSONObject obj = arr.getJSONObject(0); 

在你的情况,我没有看到这个JSON任何阵列,在你的代码是一个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"); 
} 
+0

是的,但我也需要在儿童节点 – AquaMorph

+0

,但你已经得到了你的代码中的子节点,我没有看到更多的孩子在你发布的JSON作为例子 –

+0

我想我明白你的问题,你可以有一个对象,有一个孩子,也许有一个孩子,等等。所以你可以做到这一点。 JSONObject children = head.getJSONObject(“children”);如果(children!= null)concat –

0

就可以了,只是我想你的“头”变量应该有一个返回类型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)

让我知道这是否有助于!

+0

它想让我将JSONArray更改回JSONObject – AquaMorph

+0

您是否尝试从Object类型转换为(JSONArray)? – ND27

+0

要回答您的第一个问题 - 是的,如果您使用JSONArray制作JSONObjects循环。 – ND27