从.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的一面。我只是不确定如何去做这件事。任何帮助将不胜感激!
看起来像你正在使用org.json
包。 我建议你使用net.sf.json
包http://json-lib.sourceforge.net/ 它包含更多的功能,你可以从字符串(或其他对象,如地图)创建一个JSONObject或JSONArray,没有JSONObject.fromObject(obj)
(类似的JSONArrays)的努力。
谢谢!我会给这个镜头,看看会发生什么。 – 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();
}
据我所知,这不是有效的JSON,这将是为您的困难做出贡献。 http://json.org/ – CommonsWare 2010-04-21 16:03:24
这对我来说看起来不像是有效的JSON。我怀疑你将能够获得内置的解析器来做任何事情 – synic 2010-04-21 16:04:01
我知道这将是一个搞砸了项目....但是当我建立的Web服务,就像我说它是用于黑莓应用程序,使用Visual Studio的插件......反过来它们实际上是用JavaScript编写的,Web服务完美地与BB应用程序一起工作。插件自动分析响应(通过使用Visual Studio的“添加Web参考”),所以我从来不必处理这个问题,直到我跳过平台,现在我迷路了。 – Maskau 2010-04-21 17:04:28