从.Net webservice解析JSON响应

问题描述:

为了在开放中获得这一点,我是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

看起来像你正在使用org.json包。 我建议你使用net.sf.jsonhttp://json-lib.sourceforge.net/ 它包含更多的功能,你可以从字符串(或其他对象,如地图)创建一个JSONObject或JSONArray,没有JSONObject.fromObject(obj)(类似的JSONArrays)的努力。

+0

谢谢!我会给这个镜头,看看会发生什么。 – Maskau 2010-04-21 16:58:36

玩过之后我终于找到了解决办法。尽管我对它不满意,但它确实在我的应用程序中以适合的格式显示了结果。只是想弄清楚如何让孩子直接的属性没有操纵串...

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); 
     } 
    } 

试试这个,我认为它会工作

  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(); 

      }