0

これについてはすでに多くのSOトピックがあることを認識していますが、それらはすべてかなり古くなっているようです.

IE: Twitter の GET trend/:woeidおよびJSONValue ARC の問題での SBJSON 解析の問題

ただし、私の JSON 応答は少し異なります。

これは生の文字列です (Django バックエンドから作成):

 [
  {"user":  "[
              {\"id\": \"48\"}, 
              {\"email_address\": null}, 
              {\"password\": \"f41fd61838bc65d6b2c656d488e33aba\"}, 
              {\"salt\": \"24\"}, 
              {\"date_created\": \"2013-01-27 07:59:26.722311+00:00\"},
              {\"date_modified\": \"2013-01-27 07:59:26.722357+00:00\"}, 
              {\"is_deleted\": \"False\"}
            ]"
   }
 ]

私が SBJson を使用するのを妨げているのは、SBJSonParser および/または Apple NSJSONSeriliazatoin クラス + メソッドであり、2"user":番目の前後の2 つの引用符です[(また、最後の 2 番目の後に引用のいとこを囲んでいます])。

NSMutableStringこれらの引用符は、JSON オブジェクトに変換する際に前述の両方のソリューションを台無しにします。

問題のある引用符を削除したり、それらを効果的に処理する JSON 解析ライブラリを削除したりする際のアドバイス/解決策はありますか?

NSScannerおそらくいくつかのNSMutableStringクラスメソッドがありますが、例外的に明白なものは何も思い浮かびません。

シンプルで斬新なソリューションを探しています。

4

2 に答える 2

1

表示するJSONはちょっと..無効です...上記はネストされたJSONです:

  1. ユーザーキーを持つdictの配列==別のJSONの文字列
  2. JSONのn個の辞書を持つ配列

それは私が推測する2つのステップで解析することができます...

    id s = @"[ \n \
            {\"user\": \"[%@]\" \n \
            } \n \
     ]";
    id s2 = @"{\\\"id\\\": \\\"48\\\"},{\\\"email_address\\\": \\\"null\\\"},{\\\"password\\\": \\\"f41fd61838bc65d6b2c656d488e33aba\\\"},{\\\"salt\\\": \\\"24\\\"},{\\\"date_created\\\": \\\"2013-01-27 07:59:26.722311+00:00\\\"},{\\\"date_modified\\\": \\\"2013-01-27 07:59:26.722357+00:00\\\"},{\\\"is_deleted\\\": \\\"False\\\"}";
    s = [NSString stringWithFormat:s,s2];
    id d = [s dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"\n%@ %@", s, d);
    NSError *error = nil;
    id outerJSON = [NSJSONSerialization JSONObjectWithData:d options:0 error:&error];
    if(!outerJSON && error) {
        NSLog(@"%@", error);
        return -1;
    }
    NSLog(@"\n%@", outerJSON);

    s = [[outerJSON objectAtIndex:0] objectForKey:@"user"];
    d = [s dataUsingEncoding:NSUTF8StringEncoding];
    id innerJSON = [NSJSONSerialization JSONObjectWithData:d options:0 error:&error];
    if(!innerJSON && error) {
        NSLog(@"%@", error);
        return -1;
    }
    NSLog(@"\n%@", innerJSON);
于 2013-01-27T09:28:27.127 に答える
1

他の人が言ったように、それは有効な JSON ではありません。バックエンドで修正することが最善の解決策ですが、それができない場合は、これでうまくいくはずです:

NSString *dJangoString = @"[{\"user\":  \"[{\"id\": \"48\"},{\"email_address\": null},{\"password\":\"f41fd61838bc65d6b2c656d488e33ab\"},{\"salt\": \"24\"},{\"date_created\": \"2013-01-27 07:59:26.722311+00:00\"},{\"date_modified\": \"2013-01-27 07:59:26.722357+00:00\"},{\"is_deleted\": \"False\"}]\"}]\"";

dJangoString = [dJangoString stringByReplacingOccurrencesOfString:@"\"[" withString:@"["];
dJangoString = [dJangoString stringByReplacingOccurrencesOfString:@"]\"" withString:@"]"];

NSData* dJangoData = [dJangoString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
id retObj = [NSJSONSerialization JSONObjectWithData:dJangoData options:0 error:&error];

NSLog(@"retObj = %@", [retObj description]);
于 2013-01-27T13:51:22.920 に答える