Разбор ответа JSON от веб-службы .Net - PullRequest
1 голос
/ 21 апреля 2010

Просто чтобы вывести это в открытую, я новичок в JAVA, KSOAP и JSON. Поэтому я постараюсь объяснить это как можно лучше.

Некоторое время назад я создал веб-сервис для использования приложениями Blackberry, которые мы создали с помощью плагина для Visual Studio. Сейчас над проектом, над которым я работаю, я хочу использовать тот же веб-сервис для устройств Android. По большей части у меня есть базовый код для приложения для Android. Вот моя проблема:

Я могу успешно позвонить в веб-службу и получить ответ. Из создания веб-сервиса я знаю, что он отправляет 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>

У меня такое чувство, что мне нужно будет реализовать Class и Getters / Setters на стороне Android. Я просто не знаю, как это сделать. Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 21 апреля 2010

Похоже, вы используете пакет org.json. Я предлагаю вам использовать пакет net.sf.json на http://json -lib.sourceforge.net / Он содержит гораздо больше функций, и вы можете без труда создать JSONObject или JSONArray из строки (или других объектов, таких как Map) с помощью JSONObject.fromObject(obj) (аналогично для JSONArrays).

0 голосов
/ 28 августа 2014

Попробуйте это, я думаю, это будет работать

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

            }
0 голосов
/ 26 апреля 2010

После игры я наконец-то нашел решение. Хотя я не совсем доволен этим, результаты отображаются в желаемом формате в моем приложении. Просто хочу выяснить, как получить дочерние свойства напрямую, не манипулируя строками ...

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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...