2012-03-31 39 views
0

考慮以下JSON(有效,根據jsonlint)正從一個.NET Web服務返回:無法映射有效的JSON到目標C類

{"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"}}} 

如果我嘗試並調用objectFo 「類別」的RKEY我只是得到一個錯誤「發送到實例無法識別的選擇」:

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

而不是一個JSON字符串來解析,你有一個JSON字符串,其中有一個JSON字符串。 – Corbin 2012-03-31 21:01:04

+0

是的,它就是這樣。不幸的是,我無法做任何事情來改變將要發生的事情。 – esvendsen 2012-03-31 21:27:09

+0

@Corbin +1 - 好的,我終於抓住了你說的重要性!如果你發佈的答案基本上是一樣的話,我會接受它。關鍵是我需要在得到「d」字符串後再次使用NSJSONSerialization,然後我可以得到我需要的任何東西。 – esvendsen 2012-03-31 22:25:10

回答

0

你沒有AJAX字符串。嗯,你這樣做,但事情是,你有一個字符串在裏面。

d鍵映射到字符串以同樣的方式是:

{名:「嗒嗒」}將映射obj.name字符串「嗒嗒」。

所以基本上,你需要解析JSON然後解析JSON裏面的JSON。