簡體   English   中英

json使用網址解析

[英]json Parsing using url

我正在嘗試使用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;

}
}

您的答復是:

<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。

它不是純JSON。 它具有XML標記。 只能使用XML或JSON。

如果只刪除頂部和底部的XML標簽,然后繼續進行JSON解析,那將很容易。

您正在<string>即XML中獲得JSON響應,因此首先必須從該標記中檢索JSON數據。

{“房地產”:{“ Madurai”:[{“ id”:“ 5”,“類別”:“房地產”,“類型”:“銀”,“名稱”:“ Heera”,“橫幅”: “ www.glossymob.com/soli/MapMadurai/5_banner_laptop-computer.jpg”,“徽標”:“ www.glossymob.com/soli/MapMadurai/5_logo_laptop-computer.jpg”,“關於”:“測試”,“聯系方式“:” test“,” map“:{” lat_long_1“:{” latitude“:” 10.00“,” longitude“:” 9.50“}}}],” total“: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();
            }
        }


    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM