2012-04-24 3 views
3

NSDSONSerialization과 SBJsonWriter를 여러 번 사용하여 동일한 NSDictionary 객체를 NSData로 변환하고 다른 문자열을 얻으려고했습니다. 심지어 null. 그것은 아주 이상하고 어떤 이유도 찾을 수 없습니다. = (NSJSONSerialization과 SBJson이 이상하게 작동합니다.

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) 

출력은 내가 테스트를 실행할 때마다 변경 ... 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]); 
} 

을 내 테스트 코드를 다음 을이 같은 문제를 가지고 있지 않습니다 콘솔 출력은 코드입니다. 데이터의 바이트 크기는 동일하지만, UTF8 변환 문자열 길이가 달라집니다.

답변

5

반드시 NUL 종료 문자열을 포함하지 않는 NSData 객체의 바이트. 당신이로 데이터를 변환 할 경우 0 대신 이렇게 : 일부 파서들이 더 예측 가능한 행동 이유를 설명 그들이 안전을 위해 반환 데이터의 끝에 '\ 0'을 쓸 가능성이있다

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

. 그러나 당신이 본 것처럼 그 행동에 의지해서는 안됩니다.

+0

좋은 답변입니다! 나는 방금 OP의 코드를 실행하고 정확하게 당신이 옳다고 생각했습니다. NSData는 매번 동일하게 생성되며 실패한 NSString을 생성합니다. 아마도 데이터의 끝을 넘어서는 바이트가 작동하는 경우에는 '\ 0'이 발생했을 것입니다. – mttrb

+0

사실,'stringWithUTF8String :'이 nil을 반환하는 경우 올바르지 않은 UTF-8 바이트 시퀀스와 베일을 발견했습니다. – warrenm

+0

합리적인 설명처럼 들립니다. – mttrb