10

Weather Underground API を使用してアプリを作成していますが、重大なアラートに関連するブロックを解析しているときに問題が発生しました。JSON は、サブキーと値のペアを持つキーと値のペアを使用します。これは、それらから後続の NSDictionaries を作成できるため、私にとっては問題ではありませんでしたが、重大なアラートのエントリには問題があることが証明されています。下記参照:

"alerts": [
    {
    "type": "WAT",
    "description": "Flash Flood Watch",
    "date": "3:13 PM EDT on April 28, 2012",
    "date_epoch": "1335640380",
    "expires": "8:00 AM EDT on April 29, 2012",
    "expires_epoch": "1335700800",
    "message": "\u000A...Flash Flood Watch in effect through Sunday morning...\u000A\u000AThe National Weather Service in Charleston has issued a\u000A\u000A* Flash Flood Watch for portions of northeast Kentucky... (Note: I trimmed this for length's sake),
    "phenomena": "FF",
    "significance": "A"
    }
]

「アラート」ペアは、サブ値を囲むこの[ ] ブラケットがあり、サブ値にアクセスできるようにそれをクリアする方法がわからないため、解析できた他のペアとは異なります。私が解析できた他の例では、{ } ブラケットのみがあり、{ } と [ ] ブラケットの両方はありません。参考までに、大括弧は常に存在します - 深刻な気象警報がない場合でも... その場合、「アラート」ペアは括弧 [ ] を返し、サブペアは存在しません。

[ ] 括弧を NSDictionary から削除する方法、または無視する方法はありますか? アドバイスをいただければ幸いです。


参照とト​​ラブルシューティングのヘルプについては、JSON ドキュメントの残りの部分を正常に解析する方法を次に示します。

1) 生の JSON から NSDictionary を作成する

//Process Weather Call
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

2) ネストされた json ペアの後続の辞書を作成する

NSDictionary *current_observation = [json objectForKey:@"current_observation"];

3) 値を割り当てる

NSString* weather;
weather = [current_observation objectForKey:@"weather"];

したがって、最終結果は、"Partly Cloudy" などの文字列と、ここで示していない関連する多数の天気値が表示されます。これらはスコープ ブラケット { } のみを持ち、[ ] ブラケットを持たないため、正常に解析されます。

4

2 に答える 2

19

角かっこは、配列内にある Json データを意味します。次のように解析できます

NSArray *alertArray = [json objectForKey:@"alerts"];

ここで、すべてのアラートをループして解析する必要があります (あなたの場合は 1 つだけですが、別の json 文字列でさらに多くなる可能性があります)。

//parse each alert
for (NSDictionary *alert in alertArray ){
     NSString* description = [alert  objectForKey:@"description"];
    //etc...
}
于 2012-04-28T23:18:43.003 に答える
5

さて、私はそれを機能させました-そして、@Lefterisがそれを機能させるために与えたアドバイスに基づいて構築しなければならなかったので、ここで例を提供したいと思いました.

最初にjson配列をNSArrayとして渡す必要があり、それを配列の最初の要素でNSDictionaryに変換しました。その後、@Lefterisが説明したようにすべてが機能しました。

だから、最後に、ここに私が持っているものがあります:

NSArray *alerts = [json objectForKey:@"alerts"];
NSDictionary *alertDict = [[NSDictionary alloc] init];

//Check that no alerts exist to prevent crashing
if([alerts count] < 1) {
    NSLog(@"No Alerts Here!");
    type = nil;
    ...
}
else  //Populate fields
{
    alertDict = [alerts objectAtIndex:0];
    for (NSDictionary *alert in alertDict)
    {
        NSLog(@"Printing alert!");
        type = [alertDict objectForKey:@"type"];
        ...
    }
} 

これにより、単一の配列反復で起動して実行することができました。カウントを知っており、追加のアラートを処理しているため、配列を単純に反復できると思います。助けてくれてありがとう!

于 2012-04-29T17:02:59.907 に答える