从.Net Web服务解析JSON响应

时间:2010-04-21 15:42:47

标签: java .net android json

为了解决这个问题,我是JAVA,KSOAP和JSON的新手。所以我会尽力解释这个。

不久前,我创建了一个由Blackberry Apps使用的Web服务,我们使用Visual Studio的插件构建了这个Web服务。现在我正在开发的项目,我想为Android设备使用相同的Web服务。在大多数情况下,我已经完成并运行了Android应用程序的基本代码。这是我的问题:

我可以成功调用webservice并获得响应。我知道从创建Web服务时它会发送一个JSON响应。我的问题是尝试解析JSON响应。我找到了一些我满足自己需要的例子,但是我挂了一件事。

在JSON中,每个元素前面都有“anyType”,它强制我的代码不返回任何结果(最终我将数据绑定到ArrayList)如果我“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>

我有一种感觉,我需要在Android端实现Class和Getters / Setters。我只是不确定该怎么做。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

看起来您正在使用org.json包。 我建议你在http://json-lib.sourceforge.net/使用net.sf.json包 它包含更多功能,您可以使用JSONObject.fromObject(obj)(类似于JSONArrays)从字符串(或其他对象,如Map)创建JSONObject或JSONArray。

答案 1 :(得分: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);
        }
    }

答案 2 :(得分: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();

            }