3

同じ NSDictionary オブジェクトを NSData に変換し、次に NSJSONSerialization と SBJsonWriter を使用して NSString を数回変換しようとしましたが、異なる文字列が得られることもありました。ヌルでも。それはかなり奇妙で、私は理由を見つけることができません。=( JSONKit と YAJL にはこのような問題はありません。以下は私のテスト コードです。

for (int i = 0; i < 5; i++) {
  NSDictionary *d = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"];
  NSData *data = [NSJSONSerialization dataWithJSONObject:d options:0 error:nil];
  NSLog(@"%@", [NSString stringWithUTF8String:data.bytes]);
}

コンソール出力は...

2012-04-25 01:35:33.113 Test[19347:c07] {"key":"value"}
2012-04-25 01:35:33.114 Test[19347:c07] (null)
2012-04-25 01:35:33.114 Test[19347:c07] {"key":"value"}
2012-04-25 01:35:33.114 Test[19347:c07] {"key":"value"}
2012-04-25 01:35:33.115 Test[19347:c07] (null)

テストコードを実行するたびに出力が変化します。データのバイトサイズは同じですが、UTF8 に変換した文字列の長さが異なります。

4

1 に答える 1

5

オブジェクト内のバイトは、NSData必ずしも NUL で終了する文字列を構成するわけではありません。データを に変換する場合NSStringは、代わりに次のようにします。

[[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding]

一部のパーサーは、安全のために返すデータの末尾に '\0' を書き込む可能性があります。しかし、これまで見てきたように、その動作に依存するべきではありません。

于 2012-04-24T16:45:58.193 に答える