7

単純な JSON オブジェクトを作成しようとしていますが、それでもエラーが発生し、コードの何が問題なのかがわかります。

NSString *vCard = [BRContacts getContacts]; // this is just a string, could be nil
NSDictionary *JSONdic = nil;
if (vCard)
{
    JSONdic = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"status",vCard,@"data", nil];
}
else
{
    JSONdic = [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"status",@"vCard is empty",@"error", nil];
}
NSError *error = nil;
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSONdic options:NSJSONWritingPrettyPrinted error:&error];
return [GCDWebServerDataResponse responseWithJSONObject:JSONdata];

例外は

JSON 書き込みの最上位タイプが無効です

私もチェックJSONdicしましたが、すべての場合でゼロではありません。助言がありますか?

4

3 に答える 3

4

わかりました。解決しました。この行に関連する問題でした:

return [GCDWebServerDataResponse responseWithJSONObject:JSONdata];

このGCDWebServerの応答はJSON を望んでいませんNSDataNSDictionary、エラーはresponseWithJSONObject、JSON オブジェクトを作成するために入力を処理したためです (そして、JSON の「事前処理済み」オブジェクトを渡しました)。したがって、私のエラーは最初のコードとは関係がないため、将来の参考のために今すぐ更新しました。次を使用して解決しました。

return [GCDWebServerDataResponse responseWithJSONObject:JSONdic]; 

同様の問題のドキュメントによると、必ず次の規則に従ってください。

JSON に変換できるオブジェクトには、次のプロパティが必要です。

  • 最上位オブジェクトは NSArray または NSDictionary です。
  • すべてのオブジェクトは、NSString、NSNumber、NSArray、NSDictionary、または NSNull のインスタンスです。
  • すべての辞書キーは NSString のインスタンスです。
  • 数値は NaN または無限大ではありません。
于 2015-12-10T17:17:47.290 に答える
3

ここで試してうまくいったので、何がエラーなのかわかりません。

NSString *vCard = nilとを試してみましたがNSString *vCard = @"SOMESTRING"、どちらの場合もうまくいきました。

NSString *vCard = @"SOMESTRING"; // this is just a string, could be nil
    NSDictionary *JSONdic = nil;
    if (vCard) {
        JSONdic = @{@"status" : @"1", @"data" : vCard};
    } else {
        JSONdic = @{@"status" : @"0", @"error" : @"vCard is empty"};
    }
    NSError *error = nil;
    NSData *JSONData = [NSData data];

if ([NSJSONSerialization isValidJSONObject:JSONdic]) {
    JSONData = [NSJSONSerialization dataWithJSONObject:JSONdic options:NSJSONWritingPrettyPrinted error:&error];
}

[BRContacts getContacts]を返すようにしてください。宣言NSStringを最新の構文に書き直します。NSDictionary

于 2015-12-10T15:51:41.360 に答える