菜鸟教程小白 发表于 2022-12-12 22:31:16

objective-c - NSJSONSerialization 只获取根 key


                                            <p><p>我在使用 NSJSONSerialization 从 PHP 服务器解析 JSON 时遇到问题。 JSLint 说我的 JSON 是有效的,但似乎只能进入一两个级别。</p>

<p>这本质上是我的 JSON 结构:</p>

<pre><code>{
    &#34;products&#34;:
    [{
      &#34;product-name&#34;:
      {
            &#34;product-sets&#34;:
            [{
                &#34;set-3&#34;:
                {
                  &#34;test1&#34;:&#34;test2&#34;,
                  &#34;test3&#34;:&#34;test4&#34;
                },
                &#34;set-4&#34;:
                {
                  &#34;test5&#34;:&#34;test6&#34;,
                  &#34;test7&#34;:&#34;test8&#34;
                }
            }]
      },
      &#34;product-name-2&#34;:
      {
            &#34;product-sets&#34;:
            [{

            }]
      }
    }]
}
</code></pre>

<p>这是我的解析代码:</p>

<pre><code>NSDictionary *json = ;
if (json) {
    NSArray *products = ;            // works
    for (NSDictionary *pItem in products) {                           // works
      NSLog(@&#34;Product: %@&#34;, pItem);                                 // works, prints the entire structure under &#34;product-name&#34;
      NSArray *productSets = ;// gets nil
      for (NSDictionary *psItem in productSets) {
            // never happens
      }
    }
}
</code></pre>

<p>我已经为此旋转了几个小时,但在我搜索的任何地方都找不到类似的东西。是否有任何我不知道的限制,或者我只是没有看到明显的东西?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你错过了一个嵌套对象</p>

<pre><code>NSArray *productSets = [ objectForKey:@&#34;product-sets&#34;];
</code></pre>

<p>我用这个 CLI 程序测试了它</p>

<pre><code>#import &lt;Foundation/Foundation.h&gt;

int main(int argc, const char * argv[])
{

    @autoreleasepool {


      NSString *jsonString = @&#34;{\&#34;products\&#34;:[{\&#34;product-name\&#34;: {\&#34;product-sets\&#34;: {\&#34;set-3\&#34;:{\&#34;test1\&#34;:\&#34;test2\&#34;, \&#34;test3\&#34;:\&#34;test4\&#34;}, \&#34;set-4\&#34;:{\&#34;test5\&#34;:\&#34;test6\&#34;, \&#34;test7\&#34;:\&#34;test8\&#34;} }}}, {\&#34;product-name-2\&#34;: \&#34;2\&#34;}]}&#34;;
      // insert code here...
      NSLog(@&#34;%@&#34;, jsonString);
      NSError *error;
      NSDictionary *json = options:kNilOptions error:&amp;error];

      if (json) {
            NSArray *products = ;            // works
            for (NSDictionary *pItem in products) {                           // works
                NSLog(@&#34;Product: %@&#34;, pItem);                                 // works, prints the entire structure under &#34;product-name&#34;
                NSArray *productSets = [ objectForKey:@&#34;product-sets&#34;];// gets nil
                for (NSDictionary *psItem in productSets) {
                  NSLog(@&#34;%@&#34;, psItem);
                }
            }
      }

    }
    return 0;
}
</code></pre>

<hr/>

<p>请注意,您的 json 中的某些内容很奇怪:</p>

<p>对于每个展平的对象,键应该相同。包含数字或对象的键没有多大意义。如果您需要跟踪单个对象,请包含具有适当值的 id 键。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - NSJSONSerialization 只获取根 key ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12095200/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12095200/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - NSJSONSerialization 只获取根 key