10

トップのフラストレーション!!!

サービスからJSON 応答を取得しています。将来の参照用に.plist ファイルに保存したいと考えています。JSON 応答を .plist ファイルに保存できません。nullResponseにいくつかの値が含まれているためだと思います。

注: jsonparserを使用して、レスポンスがJSON 形式 であることを確認しました。


私のコード:

NSError *error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSDictionary *dictResult = [(NSDictionary*)json objectForKey:@"myKey"];
NSLog(@"Result Dictionary :: %@",dictResult);

NSURL *cacheDir = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *path = [cacheDir URLByAppendingPathComponent:@"FinalResult.plist"];
NSLog(@"Path :: %@",path);

BOOL success = [dictResult writeToURL:path atomically:YES];
NSLog(@"success? %d", success);

注: すべてのNSLog 値を取得しました (応答ディクショナリファイル パスを意味しますが、成功の場合は 0 です)


問題 :応答にはほぼ70 ~ 80 のキーと値のペアがあり、すべての値を削除または置換したくありませんnull。なぜなら、私が欲しいのは...

  1. サーバーからの応答を取得します。
  2. すべてのUITextFieldsに Response を入力します。
  3. UITextFieldsから編集された値を使用して、サーバーに同じ応答を POST します。

UITextFieldしたがって、オブジェクトの編集済みの値を変更して、サーバーに POST させたいだけです。

これを修正する最適な方法は何ですか?

4

6 に答える 6

16

JSONには少なくとも1つのnull値が含まれているに違いありません。

を含むJSONがnullあり、それを使用して変換するとNSJSONSerializationnullはのインスタンスに置き換えられますNSNull。辞書にが含まれている場合NSNullwriteToURL:atomically:は失敗します。

これは、ディクショナリ(および配列)の読み取りと書き込みの便利なメソッドが、コレクション内のデータがプロパティリストタイプに制限されている場合にのみ機能するためです。これらは:

  • NSString
  • NSNumber
  • NSData
  • NSDate
  • NSArray
  • NSDictionary。また、辞書の場合、キーはNSStringsでなければなりません。

NSMutableString書き込み時に変更可能なサブクラス(など)を使用することもできます。

そのリストにないものがある場合はwriteToURL:atomically、または同様の便利な方法を使用することはできません。

問題は、一部の有効なJSONをプロパティリストに変換できないことです。また、一部の有効なプロパティリストはJSONに変換できません(NSDate有効なJSONに自動的に変換されないため)。

私の場合は、データをJSONファイルに書き込むだけです。元の形式のままにします。JSONとの間で簡単に変換できるので、そのままにしておきます。

于 2013-03-20T19:57:40.657 に答える
11

辞書に が含まれている場合NSNullwriteToURL:atomically: は失敗します。

辞書の場合、キーは NSStrings でなければなりません

問題は、一部の有効なJSONをプロパティ リストに変換できないことです。また、一部の有効なプロパティ リストはJSONに変換できません。

プロパティ リストを使用する必要がある場合は、ディクショナリ全体をスキャンし、null をプロパティ リスト ファイルに保存できるものに変換する必要があります。

唯一の解決策は、すべてのNULL 値を確認して@" "に置き換えることです。

ハッピーコーディング...

于 2013-04-01T10:00:38.140 に答える
3
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [paths objectAtIndex:0];
NSString *filename = @"FinalResult.plist";
NSString *pathFilename = [libraryPath stringByAppendingPathComponent:filename];

NSDictionary *dictResult = [json objectForKey:@"myKey"];
[dictResult writeToFile:pathFilename atomically:YES];
于 2013-03-24T07:15:23.263 に答える
1

この方法でファイルの URL を作成します。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSString *filename = @"FinalResult.plist";
NSString *pathFilename = [path stringByAppendingPathComponent:filename];

次に、これが次のように書かれているかどうかを確認します。

BOOL success = [dictResult writeToFile:pathFilename atomically:YES];
NSLog(@"success? %d", success);

編集- おかしい、私は最近この問題に直面したばかりで、それをすべて忘れていました。一部の JSON パーサーは、nil 値のプレースホルダーとして [NSNull null] を使用します。私はこれを書きました(真剣に、ちょうど約2週間前に、それから間隔をあけて)解析結果をクリーンアップしました...

- (NSDictionary *)compact:(NSDictionary *)aDictionary {

    NSDictionary *answer = [NSMutableDictionary dictionary];

    for (NSString *key in [aDictionary allKeys]) {
        id value = [self.dictionary valueForKey:key];
        if (value && value != [NSNull null]) {
            [answer setValue:value forKey:key];
        }
    }
    return [NSDictionary dictionaryWithDictionary:answer];
}

必要に応じて、これを NSDictionary カテゴリに追加できます。

于 2013-03-20T15:05:18.437 に答える
-1

これを試してください、うまくいきます:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"];
[jsonData writeToFile:path atomically:YES];
于 2013-03-20T15:29:19.280 に答える