Невозможно отобразить действительный JSON в классы Objective C - PullRequest
0 голосов
/ 01 апреля 2012

Рассмотрим следующий JSON (допустимый, согласно jsonlint), который возвращается из веб-службы .NET:

{"d":"{\"categories\":{\"category\":[{\"categoryID\":\"edNXeLBcDEa6sAFrxmjoXw\",\"categoryName\":\"Academics\",\"webSiteID\":\"jXKvJ3R85kiAodlhw06FjQ\",\"websiteName\":\"MySite\",\"departmentID\":\"FU0tEh2MCEu54qiVgBX6Yg\",\"departmentName\":\"WebServices\",\"departmentWebSite\":null,\"departmentLogo\":null},{\"categoryID\":\"9QcMMZjMo0G7kMM3kP7Apw\",\"categoryName\":\"Admissions\",\"webSiteID\":\"jXKvJ3R85kiAodlhw06FjQ\",\"websiteName\":\"MySite\",\"departmentID\":\"FU0tEh2MCEu54qiVgBX6Yg\",\"departmentName\":\"WebServices\",\"departmentWebSite\":null,\"departmentLogo\":null},{\"categoryID\":\"Tm207w31ZE6c39DJ1Juk2Q\",\"categoryName\":\"Webinars\",\"webSiteID\":\"jXKvJ3R85kiAodlhw06FjQ\",\"websiteName\":\"MySite\",\"departmentID\":\"FU0tEh2MCEu54qiVgBX6Yg\",\"departmentName\":\"WebServices\",\"departmentWebSite\":null,\"departmentLogo\":null}],\"metaData\":{\"recordCount\":\"3\",\"pageIndex\":\"0\",\"pageSize\":\"0\"}}}"}

Выполнение следующих действий с сериализованным JSON работает нормально:

NSDictionary *d = [jsonResults objectForKey:@"d"];

Это делает значение "d":

{"categories":{"category":[{"categoryID":"edNXeLBcDEa6sAFrxmjoXw","categoryName":"Academics","webSiteID":"jXKvJ3R85kiAodlhw06FjQ","websiteName":"MySite","departmentID":"FU0tEh2MCEu54qiVgBX6Yg","departmentName":"WebServices","departmentWebSite":null,"departmentLogo":null},{"categoryID":"9QcMMZjMo0G7kMM3kP7Apw","categoryName":"Admissions","webSiteID":"jXKvJ3R85kiAodlhw06FjQ","websiteName":"MySite","departmentID":"FU0tEh2MCEu54qiVgBX6Yg","departmentName":"WebServices","departmentWebSite":null,"departmentLogo":null},{"categoryID":"Tm207w31ZE6c39DJ1Juk2Q","categoryName":"Webinars","webSiteID":"jXKvJ3R85kiAodlhw06FjQ","websiteName":"MySite","departmentID":"FU0tEh2MCEu54qiVgBX6Yg","departmentName":"WebServices","departmentWebSite":null,"departmentLogo":null}],"metaData":{"recordCount":"3","pageIndex":"0","pageSize":"0"}}}

Если я пытаюсь вызвать objectForKey для «категорий», я просто получаю сообщение об ошибке «нераспознанный селектор отправлен в экземпляр»:

NSDictionary *categories = [d objectForKey:@"categories"];

Я перепробовал все, что мог придумать, но я никогда не смогу получить более одного уровня в этом JSON. Я могу заставить это работать на Java, но я пытаюсь написать версию моего приложения для iOS. Поскольку я новичок в Objective C, я просто должен что-то упустить. Есть идеи?

Редактировать

Вот что я делаю в Java с этим самым JSON, если это поможет:

JSONArray arrCategories = null;
String strJson = JSON.postJSONData("http://mysite.com/webservice.asmx/GetCategories", "{'destinationId' : '" + DestinationID + "', 'orderBy' : 'categoryName', 'orderByDirection' : 'asc'}");
String d = new JSONObject(strJson).getString("d");
String strCategories = new JSONObject(d).getString("categories");
arrCategories = new JSONObject(strCategories).getJSONArray("category");
for(int i=0; i < arrCategories.length(); i++) {
    JSONObject objCategory = new JSONObject(arrCategories.getString(i));
    String categoryID = objCategory.getString("categoryID");
    String categoryName = objCategory.getString("categoryName");
}

1 Ответ

0 голосов
/ 01 апреля 2012

У вас нет строки AJAX. Ну, вы делаете, но дело в том, что у вас есть строка внутри него.

Клавиша d отображается на строку так же, как:

{name: "blah"} отобразит obj.name в строку "blah".

Итак, в основном вам нужно проанализировать JSON, а затем проанализировать JSON внутри JSON.

...