NSString을 NSDictionary / JSON으로 변환


83

다음 데이터가 저장되어 있습니다 NSString.

 {
    Key = ID;
    Value =         {
        Content = 268;
        Type = Text;
    };
},
    {
    Key = ContractTemplateId;
    Value =         {
        Content = 65;
        Type = Text;
    };
},

이 데이터를 NSDictionary키 값 쌍을 포함하는 로 변환하고 싶습니다 .

나는 변환 먼저 시도하고 NSStringA를 JSON은 다음과 같이 객체 :

 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

그러나 내가 시도 할 때 :

NSString * test = [json objectForKey:@"ID"];
NSLog(@"TEST IS %@", test);

나는 값을 NULL.

누구든지 문제가 무엇인지 제안 할 수 있습니까?


1
여기서 주어진 json 문자열 "ID"는 키가 아니라 값입니다.
Sunil Zalavadiya

NSLog (@ "JSON은 % @", json); ??????
Prasad G

답변:


259

키 값에 대한 JSON 형식을 잘못 해석하고 있다고 생각합니다. 문자열을 다음과 같이 저장해야합니다.

NSString *jsonString = @"{\"ID\":{\"Content\":268,\"type\":\"text\"},\"ContractTemplateID\":{\"Content\":65,\"type\":\"text\"}}";
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

이제 다음 NSLog 문을 수행하면

NSLog(@"%@",[json objectForKey:@"ID"]);

결과는 또 다른 NSDictionary가됩니다.

{
    Content = 268;
    type = text;
}

이것이 명확한 이해를 얻는 데 도움이되기를 바랍니다.


1
그 사람에게 문자열을 다시 포맷하라고 말했기 때문에 실제로 질문에 대한 답이 아닙니다. 경우에 따라 (예 : iOS6 형식 IAP 영수증)이 형식의 문자열이 제공됩니다.
Chris Prince

1
답변을 수락 한 질문에 대해서도 언제든지 자유롭게 답변을 게시 할 수 있습니다. 따라서 서둘러 답변 버전을 게시하고 OP에 접근하여 수락 된 답변 수정을 고려하십시오. :)
Janak Nirmal

1
BTW OP가 JSON을 게시 했습니까? 확실합니까? OP의 요구 사항을 확인하고 해당 형식 내에서 달성 할 수 있습니까? 예인 경우 질문에 대답하면 찬성 투표를하고 새로운 현상금을 만들어 귀하에게 수여합니다.
Janak Nirmal 2014

14

나는 당신이 응답에서 배열을 얻는다고 생각하므로 배열에 응답을 할당해야합니다.

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData : [문자열 dataUsingEncoding : NSUTF8StringEncoding] 옵션 : NSJSONReadingMutableContainers 오류 : & err];
NSDictionary * dictionary = [배열 objectAtIndex : 0]; 
NSString * test = [dictionary objectForKey : @ "ID"];
NSLog (@ "Test is % @", test);

6

str이 JSON 문자열 인 경우 다음 코드를 사용하십시오.

NSError *err = nil;
NSArray *arr = 
 [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:NSJSONReadingMutableContainers 
                                   error:&err];
// access the dictionaries
NSMutableDictionary *dict = arr[0];
for (NSMutableDictionary *dictionary in arr) {
  // do something using dictionary
}

[arr count]는 0을 반환합니다.
GuybrushThreepwood 2013-09-11

오류는 오류입니다. Domain = NSCocoaErrorDomain Code = 3840 "작업을 완료 할 수 없습니다. (Cocoa 오류 3840.)"(JSON 텍스트가 배열 또는 개체와 함께 시작되지 않았고 조각을 허용하는 옵션이 설정되지 않았습니다.) UserInfo = 0x1f5b3660 {NSDebugDescription = JSON 텍스트 배열 또는 객체와 조각이 설정되어 있지 허용하는 옵션으로 시작되지 않았습니다}.
GuybrushThreepwood

무언가가 당신의 JSON 데이터에, 부정한다
우드 스탁

2

스위프트 3 :

if let jsonString = styleDictionary as? String {
    let objectData = jsonString.data(using: String.Encoding.utf8)
    do {
        let json = try JSONSerialization.jsonObject(with: objectData!, options: JSONSerialization.ReadingOptions.mutableContainers) 
        print(String(describing: json)) 

    } catch {
        // Handle error
        print(error)
    }
}

0

다음 코드를 사용하여 AFHTTPSessionManager실패 블록 에서 응답 개체를 가져옵니다 . 그런 다음 일반 유형을 필수 데이터 유형으로 변환 할 수 있습니다.

id responseObject = [NSJSONSerialization JSONObjectWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] options:0 error:nil];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.