2

私は Objective-C に比較的慣れていないので、MapKit の紹介に関するチュートリアル (ここにあります) に従いました。NSDictionary に渡される JSON 文字列の問題をデバッグしようとしています。次のエラーが表示されます。

2012-08-13 11:18:30.370 ArrestsPlotter[76578:c07] -[__NSCFString JSONValue]: unrecognized
selector sent to instance 0x73a6400
2012-08-13 11:18:30.372 ArrestsPlotter[76578:c07] *** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', reason: '-[__NSCFString JSONValue]: unrecognized 
selector sent to instance 0x73a6400'
*** First throw call stack:
(0x17b4022 0x131bcd6 0x17b5cbd 0x171aed0 0x171acb2 0x34782 0x35351 0x1c65e 0x17b5e42 
0xda49df 0x178894f 0x16ebb43 0x16eb424 0x16ead84 0x16eac9b 0x1ddd7d8 0x1ddd88a 0x47e626 
0x3403d 0x20f5)
terminate called throwing an exception

問題を引き起こしている次の行に絞り込みました。

NSDictionary * root = [responseString JSONValue];

SBJSON ライブラリのドキュメントによると、これは可能です。NSDictionary に渡す文字列と関係があると思います。JSON 文字列を作成するコードは次のとおりです。

// 1
MKCoordinateRegion mapRegion = [_mapView region];
CLLocationCoordinate2D centerLocation = mapRegion.center;

// 2
NSString *jsonFile = [[NSBundle mainBundle] pathForResource:@"command" ofType:@"json"];
NSString *formatString = [NSString stringWithContentsOfFile:jsonFile encoding:NSUTF8StringEncoding error:nil];
NSString *json = [NSString stringWithFormat:formatString,
                  centerLocation.latitude, centerLocation.longitude, 0.5*METERS_PER_MILE];

// 3
NSURL *url = [NSURL URLWithString:@"http://data.baltimorecity.gov/api/views/INLINE/rows.json?method=index"];

// 4
ASIHTTPRequest *_request = [ASIHTTPRequest requestWithURL:url];
__weak ASIHTTPRequest *request = _request;

request.requestMethod = @"POST";
[request addRequestHeader:@"Content-Type" value:@"application/json"];
[request appendPostData:[json dataUsingEncoding:NSUTF8StringEncoding]];
// 5
[request setDelegate:self];
[request setCompletionBlock:^{
    NSString *responseString = [request responseString];
    NSLog(@"Response: %@", responseString);
    [self plotCrimePositions:responseString];

文字列は正しく入力されており、ターミナルでは次のように表示されています (全体が巨大なので、少量だけ投稿します)。

2012-08-13 11:18:30.210 ArrestsPlotter[76578:c07] Response: {
"meta" : {
"view" : {
  "id" : "zzzz-zzzz",
  "name" : "Inline View",
  "attribution" : "Baltimore Police Department",
  "attributionLink" : "http://www.baltimorepolice.org/",
  "averageRating" : 0,
  "category" : "Crime",
  "licenseId" : "CC_30_BY",
  "numberOfComments" : 0,
  "oid" : 0,
  "publicationAppendEnabled" : false,
  "publicationStage" : "unpublished",
  "rowsUpdatedAt" : 1338813661,
  "rowsUpdatedBy" : "n22b-663u",
  "signed" : false,
  "tableId" : 354024,
  "totalTimesRated" : 0,
  "viewType" : "tabular",
  "columns" : [ {
    "id" : -1,
    "name" : "sid",
    "dataTypeName" : "meta_data",
    "fieldName" : ":sid",
    "position" : 0,
    "renderTypeName" : "meta_data",
    "format" : {
    }
  }, {
    "id" : -1,
    "name" : "id",
    "dataTypeName" : "meta_data",
    "fieldName" : ":id",
    "position" : 0,
    "renderTypeName" : "meta_data",
    "format" : {
    }
  }

どんな助けでも大歓迎です。私が使用しているチュートリアルは少し古くなっていることに気付きましたが、これまで JSON を使用したことがないため、何が問題なのかよくわかりません。

4

4 に答える 4

1

この問題は、このメソッドをサポートしていないJSONValueのインスタンスにメッセージを送信しようとしたために発生します。NSString代わりに次のコードを試してください

SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSError *error = nil;
NSArray *jsonObjects = [jsonParser objectWithString:responseString error:&error];

これにより、応答データを含む NSDictionaries の NSArray が得られます。

JSON 応答全体をここにコピーして貼り付けて、有効であることを確認することもできます。

http://jsonformatter.curiousconcept.com/

編集:他の回答のいくつかが指摘しているように、カテゴリを使用してクラスにメソッドを動的に#importing SBJSON.h追加する必要があります。ここで説明JSONValueNSString

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html

于 2012-08-13T15:51:28.307 に答える
1

実際には、ヘッダーのインポートが欠落しているのではなく (問題の一部である可能性があります)、実装.mファイルが欠落しています。NSObject+SBJson.mスタンドアロンまたはライブラリの一部としてプロジェクトに含まれていることを確認する必要があります。

于 2012-08-13T15:54:09.070 に答える
0

このエラーは、JSONValueメソッドが不明であることを示しています。をクラスに追加しました#import "SBJSON.h"か?

于 2012-08-13T15:45:36.713 に答える
0

ここでの問題は、SBJSON をプロジェクトに正しくインポートしていないという事実です。ソース ファイルの先頭に正しいヘッダーを持つ import ステートメントが含まれていることを確認してください。

于 2012-08-13T15:45:48.510 に答える