【问题标题】:How to parse unnamed JSON Array in Android app如何在 Android 应用程序中解析未命名的 JSON 数组
【发布时间】:2015-04-10 00:05:40
【问题描述】:

我通过 PHP 从我的 SQL 服务器发送了一个 JSON 数组,格式如下,我发现很难解析它而不会遇到错误。

[
{
    "placename": "place1",
    "latitude": "50",
    "longitude": "-0.5",
    "question": "place1 existed when?",
    "answer1": "1800",
    "answer2": "1900",
    "answer3": "1950",
    "answer4": "2000",
    "correctanswer": "1900"
},
{
    "placename": "place2",
    "latitude": "51",
    "longitude": "-0.5",
    "question": "place2 existed when?",
    "answer1": "800",
    "answer2": "1000",
    "answer3": "1200",
    "answer4": "1400",
    "correctanswer": "800"
},
{
    "placename": "place3",
    "latitude": "52",
    "longitude": "-1",
    "question": "place 3 was established when?",
    "answer1": "2001",
    "answer2": "2005",
    "answer3": "2007",
    "answer4": "2009",
    "correctanswer": "2009"
}
]

我已经在 J​​SONLint 验证了我的 JSON,它是有效的。在我的 HTTP 客户端处理之后,我还使用日志代码在 Eclipse 应用程序调试器中打印出我的 JSON,并且效果也很好(它显示了上面的 JSON,所以我知道它已正确下载)。

我正在尝试将 JSON 解析器纳入以下活动,但到目前为止,我的所有尝试要么包含太多错误而无法运行,要么由于 JSON 解析错误而没有返回任何结果。

这是主要活动的代码。此活动的代码改编自 NewThinkTank.com (Android Development 15),我正在尝试根据自己的需要对其进行调整,但示例中使用的 JSON 结构与我的非常不同。

我希望有人可以建议一些代码,或者给我一些指示,以了解如何正确解析这个 JSON 数组。我对 Android 编程还很陌生,所以我自己要搞清楚这是一项相当艰巨的任务。

感谢您的宝贵时间。

public class MainActivity extends Activity {

// The JSON REST Service I will pull from
static String dlquiz = "http://exampleserver.php";


// Will hold the values I pull from the JSON 
static String placename = "";
static String latitude = "";
static String longitude = "";
static String question = "";
static String answer1 = "";
static String answer2 = "";
static String answer3 = "";
static String answer4 = "";
static String correctanswer = "";

@Override
public void onCreate(Bundle savedInstanceState) {
    // Get any saved data
    super.onCreate(savedInstanceState);

    // Point to the name for the layout xml file used
    setContentView(R.layout.main);

    // Call for doInBackground() in MyAsyncTask to be executed
    new MyAsyncTask().execute();

}
// Use AsyncTask if you need to perform background tasks, but also need
// to change components on the GUI. Put the background operations in
// doInBackground. Put the GUI manipulation code in onPostExecute

private class MyAsyncTask extends AsyncTask<String, String, String> {

    protected String doInBackground(String... arg0) {

        // HTTP Client that supports streaming uploads and downloads
        DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());

        // Define that I want to use the POST method to grab data from
        // the provided URL
        HttpPost httppost = new HttpPost(dlquiz);

        // Web service used is defined
        httppost.setHeader("Content-type", "application/json");

        // Used to read data from the URL
        InputStream inputStream = null;

        // Will hold the whole all the data gathered from the URL
        String result = null;

        try {

            // Get a response if any from the web service
            HttpResponse response = httpclient.execute(httppost);        

            // The content from the requested URL along with headers, etc.
            HttpEntity entity = response.getEntity();

            // Get the main content from the URL
            inputStream = entity.getContent();

            // JSON is UTF-8 by default
            // BufferedReader reads data from the InputStream until the Buffer is full
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);

            // Will store the data
            StringBuilder theStringBuilder = new StringBuilder();

            String line = null;

            // Read in the data from the Buffer untilnothing is left
            while ((line = reader.readLine()) != null)
            {

                // Add data from the buffer to the StringBuilder
                theStringBuilder.append(line + "\n");
            }

            // Store the complete data in result
            result = theStringBuilder.toString();

        } catch (Exception e) { 
            e.printStackTrace();
        }
        finally {

            // Close the InputStream when you're done with it
            try{if(inputStream != null)inputStream.close();}
            catch(Exception e){}
        }

        //this allowed me to verify the JSON download in the debugger
        Log.v("JSONParser RESULT ", result);

        // JSON parsing needs to happen here...



        return result;

    }

    protected void onPostExecute(String result){

        // Gain access so I can change the TextViews
        TextView line1 = (TextView)findViewById(R.id.line1); 
        TextView line2 = (TextView)findViewById(R.id.line2); 
        TextView line3 = (TextView)findViewById(R.id.line3); 

        // Change the values for all the TextViews
        line1.setText("Place Name: " + placename); 

        line2.setText("Question: " + question); 

        line3.setText("Correct Answer: " + correctanswer);

    }

}

}

【问题讨论】:

    标签: android arrays json parsing


    【解决方案1】:

    查看这个答案:How to parse JSON in Android

    您将使用:

        JSONArray array = new JSONArray(result);
    

    从那里,您将遍历并获取每个 JSONObject:

    for(int i = 0; i < array.length(); i++)
    {
        JSONObject obj = array.getJSONObject(i);
    
        //now, get whatever value you need from the object:
        placename = obj.getString("placename");
    
        //or if on the MainUI thread you can set your TextView from here:
        yourTextView.setText(obj.getString("placename"));
    }
    

    祝你好运!

    【讨论】:

    • 感谢您的回复。这是我已经尝试过的,我在这里遇到的问题是“JSONArray array = new JSONArray(result);'在 Eclipse 中抛出“未处理的异常类型 JSON 异常”,因此我什至无法运行该应用程序。这对我来说毫无意义,因为我所做的只是说“数组”是使用已编译字符串的新 JSONArray“结果”。作为参考,这是我放入主要活动的内容,pastebin.com/s1TvkCC1
    • 我只需要包含在 try 和 catch 循环中,并进行一些调整使其最终工作。结果不是我想要的(它正在输出字符串,我需要列表 - derp),但是您提供的代码解决了我的问题,非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多