JSONKit解析の結果をキー/値データベース(LevelDB)に保存していますが、ダウンロードしているJSONのファイルがnullに設定されているため、対応する生成されたオブジェクト(NSArrayまたはNSDictionary)をシリアル化できません。 、オブジェクトとして保存します。
¿NSSsomething(辞書または配列)を深く反復してこれらの値を変更するにはどうすればよいですか?
JSONKit解析の結果をキー/値データベース(LevelDB)に保存していますが、ダウンロードしているJSONのファイルがnullに設定されているため、対応する生成されたオブジェクト(NSArrayまたはNSDictionary)をシリアル化できません。 、オブジェクトとして保存します。
¿NSSsomething(辞書または配列)を深く反復してこれらの値を変更するにはどうすればよいですか?
フレームワークを変更して辞書や配列から除外する方法を説明する投稿https://github.com/johnezang/JSONKit/issues/25があります。
ときどき、NULL 値が NSNull としても NSString としても認識されないものに設定されていることがありました。したがって、NSJSONSerialization で解析する前に、json 文字列内のすべての null 文字列を置き換えました。データを NSData オブジェクトに読み込み、それを NSString オブジェクトにコピーし、null 文字列を置き換えて、NSJSONSerialization が NSData オブジェクトを想定しているため、再度 NSData オブジェクトにコピーしました。もっと短く書いてもいいかもしれませんが、うまくいきます。
これがコードです
NSString *jsonPath = [myPath stringByAppendingPathComponent:@"myDataFile.json"];
NSMutableData *myJSON = [[NSMutableData alloc] initWithContentsOfFile:jsonPath];
NSString *jsonString = [[NSString alloc] initWithBytes:myJSON.bytes length:myJSON.length encoding:NSUTF8StringEncoding];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"null" withString:@"\"placeholder\""];
NSData * jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonParsingError];
その後、以前に発生したすべての null にプレースホルダー文字列が含まれます。
JSON を解析して mutableObject[[JSONDecoder decoder] mutableObjectWithUTF8String:(const unsigned char *) [json UTF8String] length:[json lengthOfBytesUsingEncoding:NSUTF8StringEncoding] error:nil ];
にし、次のコードを使用して修正しました。
-(id) fixObject: (id) a
{
if([a isKindOfClass:[NSMutableDictionary class]])
{
NSMutableDictionary *ad = a;
for (NSObject *key in ad)
{
if([[ad objectForKey:key] isKindOfClass:[NSMutableDictionary class]] || [[ad objectForKey:key] isKindOfClass:[NSMutableArray class]])
[self fixObject:[ad objectForKey:key]];
else
{
if((NSNull *)[ad objectForKey:key] == [NSNull null]) [ad setObject:@"" forKey:key];
}
}
}else if([a isKindOfClass:[NSMutableArray class]])
{
NSMutableArray *ar = a;
for (NSObject *ob in ar)
{
if([ob isKindOfClass:[NSMutableDictionary class]] || [ob isKindOfClass:[NSMutableArray class]])
{
[self fixObject:ob];
}
else if((NSNull *)ob == [NSNull null])
{
[ar removeObject:ob];
}
}
}
return a;
}
これを行うためのより良い方法を見つけたら、お知らせください。