1

これが私のpost.jsonファイルです:

[
    {
        "Title": "Introduction to WCF",
        "Url": "http://myaddress/videos/introduction-to-wcf",
        "Thumbnail": "http://myaddress/images/20110212_01.jpg",
        "Exceprt": "Introduction to WCF",
        "PostDate": "2011-02-12T14:26:07",
        "Id": 39,
        "Mp4Video": "http://myaddress/2012/05/20110212_01.mp4",
        "Speakers": [
            {
                "Name": "Mark Wilkinson",
                "Slug": "mark-wilkinson"
            }
        ],
        "Groups": [
            {
                "Name": "C# UG",
                "Slug": "cs-ug"
            }
        ],
        "Tags": [
            {
                "Name": "WCF Services",
                "Slug": "wcf-services"
            }
        ]
    }
]

これをjsonlint.orgに投稿すると、検証されます。

動作した他のJSONファイルに使用しているコードは次のとおりです。

- (void)test_can_read_from_groups_file_and_build_JSONDictionary {

    id result = [self data_from_JSON_file:@"post"];
    [Assert isNotNil:result];  // is returning as nil, so test is failing
}

- (id)data_from_JSON_file:(NSString *)fileName {

    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSString *jsonString = [bundle pathForResource:fileName ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:jsonString];
    JSONDecoder *decoder = [[JSONDecoder alloc] initWithParseOptions:JKParseOptionNone];

    NSError *error = nil;
    id result =  [decoder objectWithData:data error:&error];
    if (error) {
        NSLog(@"*********\r\r\r\r\r\r\r Error was: %@", [error localizedDescription]);
    }

    return result;
}

JSONKit objectWithDataから出力されるエラー:

Error was: Unexpected token, wanted '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', '"STRING"', 'NUMBER'.

ETA:はい、ビルドフェーズにあります:

ここに画像の説明を入力してください

追加した:

if (!data)
{
    NSLog(@"\r\r\r\r\r\r%s: data was nil", __FUNCTION__);
    return nil;
}

このブランチにヒットしていないため、データはゼロではありません。

JSONKitデコーダーを使用して次のように変更しました。

id results = [NSJSONSerialization JSONObjectWithData:data
                                                 options:kNilOptions error:&error];

そしてそれは機能しますが、JSONKitが私にとって失敗しているのにRobにとって失敗している理由についてはまだ困惑しています。

4

1 に答える 1

1

pstが指摘したように、問題はBOMであることが判明しました。Xcodeでは、ファイル名を右クリックして[名前を付けて開く]を選択し、[16進数]を選択すると、次のように表示されます。

16進ダンプ

これらの最初の3文字は、明らかに標準のテキスト文字ではありません。幸い、Xcodeの16進エディタでこれらの3文字を強調表示し、それらを削除してファイルを保存すると、修正されるはずです。


元の答え:

また、JSONがバンドルに含まれていることを確認しますか([ターゲット設定]の[ビルドフェーズ]で[バンドルリソースのコピー]を確認してください)、Cocoa標準のJSON解析クラスを使用してJSONを解析しNSJSONSerializationました。を調べて、dataすべてが正常であることを確認する必要があります。

NSLog(@"data=%@", [[[NSString alloc] initWithData:data] autorelease]);

しかし、私はあなたのJSONを問題なく解析しJSONKitましNSJSONSerializationた。

NSString *filename = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:filename];
if (!data)
{
    NSLog(@"%s: data was nil", __FUNCTION__);
    return;
}
JSONDecoder *decoder = [[JSONDecoder alloc] initWithParseOptions:JKParseOptionNone];
NSError *error = nil;
id results =  [decoder objectWithData:data error:&error];

//  Also tested with NSJSONSerialization
//
//    id results = [NSJSONSerialization JSONObjectWithData:data
//                                                 options:0
//                                                   error:&error];

if (!error)
    NSLog(@"%s: results = %@", __FUNCTION__, results);
else
    NSLog(@"%s: error = %@", __FUNCTION__, error);
于 2013-03-27T01:53:35.280 に答える