2

次のような AFNetworking ツールを使用して Web サービスを利用しています。

NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    [self GotJSONSuccess:JSON :response ];
} failure: nil ];

[operation start];

Web サービスが応答し、次の json が返されます。

[
{
    "statusid": 1,
    "statusdesc": "ASSIGNED"
},
{
    "statusid": 2,
    "statusdesc": "COMPLETED"
},
{
    "statusid": 3,
    "statusdesc": "IN TRANSIT"
},
{
    "statusid": 4,
    "statusdesc": "DELAYED"
},
{
    "statusid": 5,
    "statusdesc": "ON HOLD"
}
]

以下を使用して、json を解析しようとしています。

- (void)GotJSONSuccess: (NSString*) JSON : (NSHTTPURLResponse*) response
{

NSString *newString = [NSString stringWithFormat:@"%@",JSON];

NSLog(@"response: %@", JSON);
NSData* data = [newString dataUsingEncoding:NSUTF8StringEncoding];
NSError* error;
id jsonObjects = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

if (error){
    NSLog(@"error is %@", [error localizedDescription]);
    return;
}

NSArray *keys = [jsonObjects allKeys];

for (NSString *key in keys){
    NSLog(@"%@ is %@",key, [jsonObjects objectForKey:key]);
}
}

ただし、コードはエラー ブロックに分類され、出力は「操作を完了できませんでした。(Cocoa エラー 3840.)」です。

この単純なjsonの解析で間違っているのは何ですか?

私が取っているものよりも優れた解析アプローチはありますか?

可能であれば、ネイティブの iOS クラスと解析メソッドに固執したいと思います。

4

3 に答える 3

4

NSJSONSerialization クラスを使用して、そのような配列を作成できます

NSArray *arr = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];

そして、ステータスIDごとに、配列にインデックスを付けて辞書を引き出します。

NSDictionary *dict = [arr objectAtIndex:0];

その最後の行は次のようになります:`

{
    "statusid": 1,
    "statusdesc": "ASSIGNED"
}

そして、オブジェクトのようなメソッドを辞書のキーに使用できます。

于 2013-01-10T21:58:00.683 に答える
0

FoundationErrors.h を調べると (または、リンクされたフレームワークを含むプロジェクトで 3840 を検索するだけで、私が行ったように)、エラーが NSPropertyListReadCorruptError に対応していることがわかります。これをグーグルで検索すると、JSON が無効である可能性が示唆されます。おそらく、JSON の前後に追加のスペース文字がありますか? サーバーから取得している URL または完全な応答を投稿できますか?

kNilOptions とは何ですか?

于 2013-01-11T14:11:21.720 に答える
0
NSArray *array = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
NSArray *arrStatusid = [array valueForKey:@"statusid"];

AFNetworkingの新しいバージョン (2nd) でこれを試してください:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:req];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id response){

    //data is in response

} failure:^(AFHTTPRequestOperation *operation, NSError *err){

    //some code on failure
}];
[operation start];
于 2015-01-09T12:30:14.680 に答える