【问题标题】:json Parsing using url使用url解析json
【发布时间】:2012-12-16 13:42:26
【问题描述】:

我正在尝试使用 url 解析 json。我可以通过使用临时 url 来实现它,但是当我使用我的主主机 url 时,json 返回 html 值?

临时网址

(http://md-plesk-web9.webhostbox.net:8880/sitepreview/http/glossymob.asia/Webservice.asmx/SpecificCategory?category=real%20estate&location=Madurai)

我的代码

// url to make request
private static String url = "http://md-plesk-web9.webhostbox.net:8880/sitepreview/http/glossymob.asia/Webservice.asmx/SpecificCategory?category=hotel&location=Madurai";

// JSON Node names
private static final String TAG_MAIN ="hotel";
private static final String TAG_VALUE = "Madurai";
private static final String TAG_ID = "id";
private static final String TAG_CATEGORY = "category";
private static final String TAG_TYPE = "type";
private static final String TAG_NAME = "name";
private static final String TAG_BANNER = "banner";
private static final String TAG_LOGO = "logo";
private static final String TAG_ABOUT = "about";
private static final String TAG_CONTACT = "contact";
private static final String TAG_MAP = "map";

private static final String TAG_MAP_LAT_LONG = "lat_long_1";
private static final String TAG_MAPLATITUDE = "latitude";
private static final String TAG_MAPLONGITUDE = "longitude";
private static final String TAG_CATEGORY_TOTAL = "total";

// contacts JSONArray
JSONArray contacts = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);
    Log.v("exact string value", json.toString());
    try {

        // Getting Array of Contacts
        JSONObject js= json.getJSONObject(TAG_MAIN);
        int ival = js.getInt(TAG_CATEGORY_TOTAL);
        contacts = js.getJSONArray(TAG_VALUE);
        Log.v("Total:", ""+ival);
        // looping through All Contacts
        for(int i = 0; i < contacts.length(); i++){
            JSONObject c = contacts.getJSONObject(i);

            // Storing each json item in variable
            String id = c.getString(TAG_ID);
            String category = c.getString(TAG_CATEGORY);
            String type = c.getString(TAG_TYPE);
            String name = c.getString(TAG_NAME);
            String banner = c.getString(TAG_BANNER);
            String logo = c.getString(TAG_LOGO);
            String about = c.getString(TAG_ABOUT);
            String contact = c.getString(TAG_CONTACT);

            Log.v("Values:", id+"--"+category+"--"+type+"--"+name+"--"+banner+"--"+logo+"--"+about+"--"+contact);


            // Phone number is agin JSON Object
            JSONObject mapval = c.getJSONObject(TAG_MAP);

            JSONArray con = js.getJSONArray(TAG_VALUE);
            JSONObject mapvalues = con.getJSONObject(0);
            String latitude = mapvalues.getString(TAG_MAPLATITUDE);
            String longitude = mapvalues.getString(TAG_MAPLONGITUDE);
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_ID, id);
            map.put(TAG_CATEGORY, category);
            map.put(TAG_TYPE, type);
            map.put(TAG_NAME, name);
            /*Log.v("Received json values", ""+map.toString());*/
            // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

我通过运行得到的值是精确的 json

01-02 12:03:38.300: V/exact string value(30124): {"hotel":{"total":1,"Madurai":[{"id":"3","logo":"www.glossymob.com\/soli\/MapMadurai\/3_logo_laptop-computer.jpg","category":"Hotel","name":"araas","map":{"lat_long_1":{"longitude":"76.9000","latitude":"8.5000"}},"about":"test","type":"Silver","contact":"test","banner":"www.glossymob.com\/soli\/MapMadurai\/3_banner_laptop-computer.jpg"}]}}
01-02 12:03:38.300: V/Total:(30124): 1
01-02 12:03:38.300: V/Values:(30124): 3--Hotel--Silver--araas--www.glossymob.com/soli/MapMadurai/3_banner_laptop-computer.jpg--www.glossymob.com/soli/MapMadurai/3_logo_laptop-computer.jpg--test--test

当我尝试替换它时 主要网址

(http://www.glossymob.asia/Webservice.asmx/SpecificCategory?category=real%20estate&location=Madurai)

我得到的值是

01-02 11:07:27.116: V/json string value(29330): <html>
<head> 
   <title>Runtime Error</title>    
<style>         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}          p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }         pre {font-family:"Lucida Console";font-size: .9em}         .marker {font-weight: bold; color: black;text-decoration: none;}         .version {color: gray;}         .error {margin-bottom: 10px;}         .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }  
  </style>
 </head>
 <body bgcolor="white">    
    <span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>            <h2> <i>Runtime Error</i> </h2></span>  
      <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">            <b> Description: </b>An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.            <br><br> 
       <b>Details:</b> To enable the details of this specific error message to be viewable on remote machines, please create a &lt;customErrors&gt; tag within a &quot;web.config&quot; configuration file located in the root directory of the current web application. This &lt;customErrors&gt; tag should then have its &quot;mode&quot; attribute set to &quot;Off&quot;.<br><br>      
  <table width=100% bgcolor="#ffffcc">               <tr>                  <td>                      <code><pre>&lt;!-- Web.Config Configuration File --&gt;&lt;configuration&gt;    &lt;system.web&gt;        &lt;customErrors mode=&quot;Off&quot;/&gt;    &lt;/system.web&gt;&lt;/configuration&gt;</pre></code>                  </td>               </tr>            </table>   
     <br>            <b>Notes:</b> The current error page you are seeing can be replaced by a custom error page by modifying the &quot;defaultRedirect&quot; attribute of the application's &lt;customErrors&gt; configuration tag to point to a custom error page URL.<br><br>          
<table width=100% bgcolor="#ffffcc">               <tr>                  <td>                      <code><pre>&lt;!-- Web.Config Configuration File --&gt;&lt;configuration&gt;    &lt;system.web&gt;        &lt;customErrors mode=&quot;RemoteOnly&quot; defaultRedirect=&quot;mycustompage.htm&quot;/&gt;    &lt;/system.web&gt;&lt;/configuration&gt;</pre></code>                  </td>               </tr>      
  </table>            <br>  
</body>
</html>

我正在处理该 Xml 数据,通过替换字符串和我的 json 返回确切的 json 字符串值。看看我的 JSONParser 类。 包 com.androidhive.jsonparsingtest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // 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) {


            line = line.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>","");
            line = line.replace("<string xmlns=\"http://tempuri.org/\">","");
            line = line.replace("</string>","");
            Log.v("string value", line);
            sb.append(line);
            //Log.v("sbstring value", sb.toString());
        }
        is.close();
        json = sb.toString();
        Log.v("json string value", json);
    } 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;

}
}

【问题讨论】:

  • 它是 XML 包装 JSON。
  • 是的,我已经通过在我的 json 解析器中替换那些不需要的字符串来处理。看看我的 json 解析器。@nhahtdh
  • 您是否在此 json 中使用那些 xml 标记的字符串。如果你忽略了你可以获得数据。

标签: android json parsing url


【解决方案1】:

您在 &lt;string&gt; 即 XML 中获得 JSON 响应,因此首先您必须从该标记中检索 JSON 数据。

{“真实的 庄园":{"马杜赖":[{"id":"5","category":"real 庄园”,“类型”:“银”,“名称”:“Heera”,“横幅”:“www.glossymob.com/soli/MapMadurai/5_banner_laptop-computer.jpg”,“logo”:“www.glossymob。 com/soli/MapMadurai/5_logo_laptop-computer.jpg","about":"test","contact":"test","map":{"lat_long_1":{"latitude":"10.00","longitude" :"9.50"}}} ],"总计":1} }

解决办法:

收到来自网络的数据后,请致电parse()

例如:

XMLParser parser = new XMLParser();
JSONArray jsonRes = parser.parse(response.getEntity().getContent());
// response is the HTTPResponse object

这是 XMLParser 类:

public class XMLParser extends DefaultHandler {

    private static String ROOT_ELEMENT = "string";
    private StringBuffer data = new StringBuffer();

    private JSONArray jsonData;

    public XMLParser() {
    }

    public JSONArray parse(InputStream in) {
        try {
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
            parser.parse(in, this);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return jsonData;
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        data.replace(0, data.length(), "");

        if (localName.equalsIgnoreCase(ROOT_ELEMENT)) {
            jsonData = new JSONArray();
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        data.append(ch, start, length);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {

        if (localName.equalsIgnoreCase(ROOT_ELEMENT)){
            try {
                jsonData = new JSONArray(data.toString());
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }
}

【讨论】:

  • 我成功获取了 json 字符串。我的问题是当我尝试使用我的主主机 URL 时,我没有得到 json.@Paresh Mayani
【解决方案2】:

它不是纯 JSON。它有 XML 标签。要么只使用 XML,要么使用 JSON。

如果你只删除顶部和底部的 XML 标签,然后继续进行 JSON 解析,那就很容易了。

【讨论】:

  • 是的,我只是这样做了,但是当我使用临时 URL 时,我能够替换字符串并获取准确的 json。当我尝试使用我的主机 URL 时,我越来越喜欢 Html 的东西。 @nithinreddy
  • 我确定问题不在于这个。您可能在代码中使用了错误的 URL。因为您显示的日志来自服务器,而不是来自 Android。
【解决方案3】:

你的回答是:-

<string xmlns="http://tempuri.org/">
{"real estate":{"Madurai":[{"id":"5","category":"real estate","type":"Silver","name":"Heera","banner":"www.glossymob.com/soli/MapMadurai/5_banner_laptop-computer.jpg","logo":"www.glossymob.com/soli/MapMadurai/5_logo_laptop-computer.jpg","about":"test","contact":"test","map":{"lat_long_1":{"latitude":"10.00","longitude":"9.50"}}} ],"total":1} }
</string>

现在首先你需要替换为

responseString = responseString.replace("<string xmlns=\"http://tempuri.org/\">","");
responseString = responseString.replace("</string>","");

请在替换上述行后将字符串转换为 JSONObject。

【讨论】:

  • 我已经做到了@V.J.我的问题与此不同!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多