【问题标题】:Parse JSON which is within HTML in Tags in Android app [duplicate]在 Android 应用程序的标签中解析 HTML 中的 JSON [重复]
【发布时间】:2013-03-27 00:18:44
【问题描述】:

我的问题和我想的有点不同,我之前问过:Parse JSON to cofigure android application 我有来自服务器的 json,当我在浏览器源代码中查看它时;这就是它的样子

JOSON.config:

<html>
<head></head>
<body>
<pre>
 [

    {
        "sett": " ",
        "glHdr": {
            "sm": [ ],
            "scleHPad": false,
            "st": "sbsm"
        },
        "colrBG": [
            23,
            105,
            184,
            100
        ],
        "colrTB": [
            0,
            0,
            0,
            0
        ],
        "colrTR": [
            255,
            255,
            255,
            100
        ],
        "glFtr": {
            "icoSz": "icoSzN",
            "sm": [ ],
            "scleHPad": false,
            "gvNR": 3,
            "gvHIT": false,
            "gvNC": 3,
            "st": "igsm"
        },
        "statBr": true
    },
    {
        "sm": [
            {
                "tbico": "b43-jeep.png",
                "t": "Welcome!",
                "w": "http://google.com/start",
                "st": "w",
                "wTBL": "wTBLN"
            },
            {
                "t": "Content screen title",
                "f": "Eltec%20Spec%20sheet%20Gim%20RD30W.pdf",
                "st": "f"
            },
            {
                "tbico": "109-chicken.png",
                "t": "Sub menu",
                "sm": [
                    {
                        "t": "Screen 1",
                        "st": "f"
                    },
                    {
                        "t": "Screen 2",
                        "w": "Http://google.com",
                        "st": "w",
                        "wTBL": "wTBLT"
                    }
                ],
                "st": "sm"
            },
            {
                "st": "f"
            }
        ],
        "st": "tbm"
    }

]

</pre>
</body>
</html>

扫描json的函数:

   public void doScanAppConfigJson(){


            JSONArray appConfig = null;

            // Function for looping json object via ParseJson class.
            //Creating JSON Parser instance
            JSONParser jParser = new JSONParser();

            //Getting json strings from url
            JSONObject jsonObject = jParser.getJSONFromUrl(url);

        try{
            //Getting array of settings
            appConfig = jsonObject.getJSONArray(ConfigConstants.TABLE_VIEW_SUB_MENU_CONFIG);
            //loop throw all the objects under -sm[]
            for (int i = 0; i < appConfig.length(); i++){

                JSONObject sm = appConfig.getJSONObject(i);

                //Now store each of this json in local constant var.

                String tabTitle = sm.getString(TAG_TITLE);

                String webAddress = sm.getString(TAG_WEB_ADDRESS);

                String screenType = sm.getString(TAG_SCREEN_TYPE);

                String fileName = sm.getString(TAG_FILENAME);

            }

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

        }

        }

getJsonFromUrl 方法:

public JSONObject getJSONFromUrl(String url) {

    //Global authentication for link username and password.
    Authenticator.setDefault(new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication(){

        return new PasswordAuthentication("username", "password".toCharArray());   
        }

    });

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

} 

我得到的错误是:http://cl.ly/image/0z1u2v30341G

现在我猜它是 html doctype 的 bcz 或其他东西,但我找不到什么问题。

问:如何解析这个 JSON 并将其存储在局部变量中? (我没有为 json 更改服务器端的选项)提前致谢。

【问题讨论】:

  • 如果您可以配置服务器以停止将其包装在 html 标签中,那将是理想的。
  • @SamDufel:我没有更改服务器端代码的选项!我可以在应用程序中做些什么来避免这个标签并读取 json?
  • 这与您之前的问题有何不同?

标签: java android json performance android-intent


【解决方案1】:

您可以从打开 '[' 到关闭 ']' 提取子字符串,然后将其解析为 json,在您的 getJSONFromUrl() 方法中进行更改:

public void getJSONFromUrl() {
     ...
     ...

     json = sb.toString().substring(html.indexOf("["), html.lastIndexOf("]") + 1);

     ...
}

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2019-09-08
    • 2023-04-06
    相关资源
    最近更新 更多