2010-04-21 112 views
1

爲了在開放中獲得這一點,我是JAVA,KSOAP和JSON的新手。所以我會盡我所能解釋這一點。從.Net webservice解析JSON響應

前段時間,我創建了一個Web服務供Blackberry Apps使用,我們使用Visual Studio插件構建了這些服務。現在我正在開發的這個項目,我想要爲Android設備使用相同的Web服務。在大多數情況下,我有Android應用程序的基本代碼完成和工作。這是我的問題:

我可以成功地調用web服務並獲得響應。我知道從創建webservice它發送一個JSON響應。我的問題是試圖解析通過JSON響應。我找到了一些適合自己需求的例子,但是我已經掛上了一件事。 (0).toString()這裏是我得到的,如果我「getProperty(0).toString()」,則返回「 ...

anyType{Artist=anyType{TrackName=Champagne Supernova;}; 

這裏是我使用的解析JSON對象的代碼....

SoapObject gr = (SoapObject)envelope.getResponse(); 
     String ro = gr.getProperty(0).toString(); 
       //Added just to see structure of response 
     Artist_Result.add(gr.toString()); 

     if (ro.startsWith("{")) 
     { 
      JSONObject JSONObj = new JSONObject(ro); 
      Iterator<String> itr = JSONObj.keys(); 
      while (itr.hasNext()) 
      { 
       String key = (String)itr.next(); 
       String value = JSONObj.getString(key); 
       //bundleResult.putString(key, value); 
       Artist_Result.add(value); 
      } 

     } 
     else if (ro.startsWith("[")) 
     { 
      JSONArr = new JSONArray(ro); 
      for (int i = 0; i < JSONArr.length(); i++) 
      { 
       JSONObj = (JSONObject)JSONArr.get(i); 
       //bundleResult.putString(String.valueOf(i), JSONObj.toString()); 
       Artist_Result.add(JSONObj.toString()); 
      } 
     } 

WebService的代碼:

[WebMethod] 
[return: System.Xml.Serialization.XmlArrayItemAttribute(typeof(Artist))] 
public Artist[] GetArtist(string ArtistQuery) 
{ 
    // All the SQL Stuff Here 

    SqlDataReader sReader; 
    sReader = cmd.ExecuteReader(); 

    List<Artist> Artists = new List<Artist>(); 
    while (sReader.Read()) 
    { 
     Artist result = new Artist(); 
     result.TrackName = sReader.GetString(0); 

     Artists.Add(result); 
    } 
    sReader.Close(); 
    sqlConn.Close(); 

    return Artists.ToArray(); 
} 

public class Artist 
{ 
    public string TrackName; 
} 

示例XML輸出的瀏覽器:

<?xml version="1.0" encoding="utf-8" ?> 
- <ArrayOfArtist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://bb.mcrcog.com/"> 
    - <Artist> 
      <TrackName>Champagne Supernova</TrackName> 
     </Artist> 
    - <Artist> 
     <TrackName>Don't Look Back In Anger</TrackName> 
     </Artist> 
    - <Artist> 
      <TrackName>D'you Know What I Mean</TrackName> 
     </Artist> 
    - <Artist> 
      <TrackName>Go Let It Out</TrackName> 
     </Artist> 

我有一種感覺,我需要實現一個類,和getter/setter方法對Android的一面。我只是不確定如何去做這件事。任何幫助將不勝感激!

+3

據我所知,這不是有效的JSON,這將是爲您的困難做出貢獻。 http://json.org/ – CommonsWare 2010-04-21 16:03:24

+2

這對我來說看起來不像是有效的JSON。我懷疑你將能夠獲得內置的解析器來做任何事情 – synic 2010-04-21 16:04:01

+0

我知道這將是一個搞砸了項目....但是當我建立的Web服務,就像我說它是用於黑莓應用程序,使用Visual Studio的插件......反過來它們實際上是用JavaScript編寫的,Web服務完美地與BB應用程序一起工作。插件自動分析響應(通過使用Visual Studio的「添加Web參考」),所以我從來不必處理這個問題,直到我跳過平臺,現在我迷路了。 – Maskau 2010-04-21 17:04:28

回答

1

看起來像你正在使用org.json包。 我建議你使用net.sf.jsonhttp://json-lib.sourceforge.net/ 它包含更多的功能,你可以從字符串(或其他對象,如地圖)創建一個JSONObject或JSONArray,沒有JSONObject.fromObject(obj)(類似的JSONArrays)的努力。

+0

謝謝!我會給這個鏡頭,看看會發生什麼。 – Maskau 2010-04-21 16:58:36

0

玩過之後我終於找到了解決辦法。儘管我對它不滿意,但它確實在我的應用程序中以適合的格式顯示了結果。只是想弄清楚如何讓孩子直接的屬性沒有操縱串...

try 
    { 
     HttpTransportSE at = new HttpTransportSE(URL); 
     at.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
     at.call(SOAP_ACTION, envelope); 

     SoapObject gr = (SoapObject)envelope.getResponse(); 
     for(int i = 0; i < gr.getPropertyCount(); i++) 
     { 
      String start = gr.getProperty(i).toString(); 
      int left = 18; 
      int iosc = start.indexOf(";"); 
      String end = start.substring(left, iosc); 
      Artist_Result.add(end); 
     } 
    } 
0

試試這個,我認爲它會工作

  SoapObject response = (SoapObject) envelope.getResponse(); 

      int cols = response.getPropertyCount(); 

      for (int i = 0; i < cols; i++) { 
       Object objectResponse = (Object) response.getProperty(i); 




       SoapObject r =(SoapObject) objectResponse; 

      String TrackName=(String) r.getProperty("TrackName").toString(); 

       // Get the rest of your Properties by 
       // (String) r.getProperty("PropertyName").toString(); 

      }