문제

JSON-Framework를 사용하여 JSON 응답으로 NSDictionary를 생성합니다. 그렇게 많은 것이 훌륭하게 작동합니다.

이제이 JSON 페이로드 안에는 하나 이상의 객체가 있습니다 - X라고합시다. XML에서 이와 같은 종류 :

<OBJECTS>
  <X>
    ...
  </x>
  <X>
    ...
  </X>
  <X>
    ...
  </X>
</OBJECTS>

내가 위에서 언급 한 nsdictionary 객체를 모든 XS와 같이 볼 때 :

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];

또는:

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];

GDB에 따르면 a nscfarray nsdictionary 객체의. (예, 나도 여기서 재미있는 냄새가 나지만 잠시 후에는 더 많은 것입니다.)

만있을 때 하나 X라는 객체, 나는 정직하게 좋은 nsdictionary로 돌아갑니다.

그래서 ... X가 얼마나 많은지 상관없이 이것을 일관되게 행동하게하려면 어떻게해야합니까?

언뜻보기에, 나는 단지 결과를 바꾸라고 생각합니다. nsarray *, 그러나 결과를 빠르게 열거하고 싶을 때 어떻게됩니까? 지금 나는 이것을한다 :

for (NSDictionary *result in results)

NSCFARRAY 사례 (다중 XS)에서는 각 X에 대해 개별 NSDictionary를 되 찾습니다. 단일 X 케이스에서는 내 관점이 너무 깊다는 점을 제외하고는 하나의 NSDictionary를 되 찾습니다. 다시 말해,이 대신 (고려 된 예) 대신 :

(gdb) po results
<NSCFArray 0xd4a940>(
{
    foo =     {
        bar = "something";
    };
}
{
    foo =     {
        bar = "something else";
    };
}
)

나는 이것을 얻는다 :

(gdb) po results
{
    foo =     {
        bar = "something";
    };
}

단서를 환영합니다/감사합니다! 당신은 이것을 전혀 분리해야 할 필요가 있는지 물어볼 수도 있지만 지금은이 여행이 실제로 필요하다고 가정 해 봅시다. (아직도, 누군가가 그것에 대해 충분히 느끼면 다른 방법으로 설득되어 기쁩니다.)

궁극적으로 하루가 끝나면 nsdictionary 객체의 nsarray를 원합니다.

도움이 되었습니까?

해결책

JSON 또는 JSON-FRAMEWORK에 익숙하지 않지만 X가 모두 동일한 키를 갖기 때문에 X에 액세스하는 데 분명히 사용될 수 없습니다.

ObjectforKey :@"Objects"가 nsDictionary (단일 요소) 또는 nsDictionary (다중 X 요소)를 반환한다는 것을 알고 있다면 다음과 같은 작업을 수행 할 수 있습니다.

if ( ![results isKindOfClass:[NSArray class]] ) {
    results =[NSArray arrayWithObject:results];
}

JSON- 프레임 워크가 어떻게 작동하는지 정확히 이해한다고 가정하면 일관된 결과를 얻을 수 있습니다. 요소가 nsditionary 대신 항목 배열을 반환하면 다소 연약 할 것입니다.

JSON-Framework에 대한 구성 설정이있을 수 있으며,이 경우 동작 방식을 제어 할 수 있으며 바람직합니다.

다른 팁

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];

그리고

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];

위의 두 가지는 정확히 동일합니다. 첫 번째 작업은 두 번째 작업보다 약간 비용이 많이 드는 작업입니다.

내가 한 일은 다음과 같습니다.

// Get the JSON response and return the result:
NSString *jsonString = [NSString stringWithContentsOfURL:url];
NSDictionary *dict = [jsonString JSONValue];

// If OBJECTS.X gets a dictionary (one value), make an array of one.
id myObject = [dict valueForKeyPath:@"OBJECTS.X"];
if ([myObject isKindOfClass:[NSDictionary class]]) {
    results = [NSArray arrayWithObject:myObject];
} else {
    results = myObject;
}

그것을 지적 할 가치가 있습니다 JSONVALUE 사전을 반환 할 수도 있습니다 또는 배열. 그러나 나는 사전 사전 지정 (Objects.x) 내부를보고 있습니다.

나는 당신의 두 코드 예제를 생각하지 않습니다.

NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];

그리고

NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];

동등합니다. Key-Value-Coding에는 컬렉션과 함께 작업 할 수있는 추가 스마트가 있습니다. (예제는 블로그 게시물에서 찾을 수 있습니다. Theocacao : Nsarray 및 KVC Scott Stevenson :) 전자로 되돌아 가면 기대하는 행동을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top