解析来自 .Net Web 服务的 JSON 响应

Posted

技术标签:

【中文标题】解析来自 .Net Web 服务的 JSON 响应【英文标题】:Parsing a JSON Response from a .Net webservice 【发布时间】:2011-02-10 16:20:38 【问题描述】:

只是为了公开这个我是 JAVA、KSOAP 和 JSON 的新手。所以我会尽力解释这一点。

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

我可以成功调用网络服务并得到响应。我通过创建 Web 服务知道它发送 JSON 响应。我的问题是试图解析 JSON 响应。我找到了一些适合我需要的示例,但是我对一件事很感兴趣。

在 JSON 中,每个元素前面都有“anyType”,这迫使我的代码不返回任何结果(最终我将数据绑定到 ArrayList)如果我“getProperty(0).toString(). ..

anyTypeArtist=anyTypeTrackName=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());
            
        

网络服务代码:

 [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 端实现一个类和 Getters/Setters。我只是不知道该怎么做。任何帮助将不胜感激!

【问题讨论】:

AFAIK,这不是有效的 JSON,这将增加您的难度。 json.org 对我来说这根本不像是有效的 JSON。我怀疑你能否让内置的解析器用它做任何事情 我知道这将是一个混乱的项目....但是当我构建 Web 服务时,就像我说的那样,它是用于黑莓应用程序的,使用 Visual Studio 的插件....反过来,它们实际上是用 javascript 编写的,并且 Web 服务与 BB 应用程序完美配合。插件会自动解析响应(通过使用 Visual Studio 的“添加 Web 引用”),所以我从来不用处理这个,直到我跳过平台,现在我迷路了。 【参考方案1】:

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

【讨论】:

谢谢!我会试一试,看看会发生什么。【参考方案2】:

在玩了之后,我终于找到了解决方案。尽管我对此并不完全满意,但这确实在我的应用程序中以理想的格式显示了结果。只想弄清楚如何在不操作字符串的情况下直接获取子属性...

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

【讨论】:

【参考方案3】:

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

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

            

【讨论】:

以上是关于解析来自 .Net Web 服务的 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

解析来自 Httpwebrequest 的 Json 响应

如何缓存来自 Web 服务器的 okHTTP 响应?

解析来自串行窗口的 json 响应

转换来自 web 服务的 Json 格式响应

如何在 AJAX POST 请求后解析来自服务器的 JSON 响应?

如何解析从 Web 服务响应收到的 JSON 响应