菜鸟教程小白 发表于 2022-12-13 16:59:55

ios - 如何在对象内映射 JSON 数据对象?


                                            <p><p>我正在尝试从 API 调用中获取一些数据并将这些对象映射到模型对象。就我而言,我在一个对象中有一个对象。这是工作并收到 JSON。它与第一个对象的映射很好。在我的 JSON 中,我有一个数组和另一个数组。所以我做了以下事情来完成这项工作。</p>

<p><strong>对象映射</strong></p>

<pre><code>+(NSArray *)fromJSON:(NSDictionary *)objectNotation error:(NSError *__autoreleasing *)error{
    NSError *localError = nil;

    NSDictionary *parsedObject = [ initWithDictionary:objectNotation];

    if (localError != nil) {
      *error = localError;
      return nil;
    }
    NSMutableArray *posts = [ init];

    NSArray *results = ;
    NSLog(@&#34;Count %lu&#34;, (unsigned long)results.count);

    for (NSDictionary *groupDic in results) {
      Post *post = [ init];
      post.postBody = ;

      for (NSString *key in groupDic) {
            if () {
                forKey:key];
            }
      }
      ;
    }
    return posts;
}
</code></pre>

<p>由于 for 循环,这个生成的元数据比我预期的要多。</p>

<p><strong>模型类</strong></p>

<pre><code>@interface OCPost : NSObject
@property(nonatomic) NSInteger postId;
@property(nonatomic) NSInteger userId;
@property(nonatomic) NSInteger points;
@property(strong, nonatomic) NSMutableArray *body;
@end
</code></pre>

<p>我想将 <code>body</code> 数组映射到 <code>Body</code> 对象数组。在我的 body 课上</p>

<pre><code>@interface Body : NSObject
@property (strong, nonatomic) NSString *value;
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSMutableArray *metaData;
@end
</code></pre>

<p><code>元数据</code>也应该与以下对象映射。</p>

<pre><code>@interface MetaData : NSObject
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *metaDataDescription;
@end
</code></pre>

<p>我怎样才能制作一个像,</p>

<pre><code>Post
|_Body1
||_MetaData1
||_MetaData2
||_MetaData3
|_Body3
||_MetaData1
||_MetaData2
</code></pre>

<p>请帮忙。</p>

<p><strong>JSON</strong></p>

<pre><code>{
   &#34;message&#34;: &#34;Post &#34;,
   &#34;data&#34;: [
      {
      &#34;postId&#34;: 1,
      &#34;timestamp&#34;: &#34;2016-06-14 22:37:02&#34;,
      &#34;body&#34;: [
          {
            &#34;textId&#34;: 1,
            &#34;type&#34;: &#34;link&#34;,
            &#34;deleting&#34;: false,
            &#34;metaData&#34;: [
          {
            &#34;metadataId&#34;: 1,
            &#34;type&#34;: &#34;text&#34;,
            &#34;value&#34;: &#34;under &#34;
          }
          ]
      },
      {
         &#34;textId&#34;: 2,
         &#34;type&#34;: &#34;department&#34;,
         &#34;deleting&#34;: false,
         &#34;metaData&#34;: [
            {
                &#34;metadataId&#34;: 2,
                &#34;type&#34;: &#34;text&#34;,
                &#34;value&#34;: &#34;under &#34;
            }
         ]
      }
      ]
    }
]
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好的,您可以手动解析 JSON 并将其映射到您的数据模型。<br/>
这是你可以做到的:</p>

<pre><code>+(NSArray *)fromJSON:(NSDictionary *)objectNotation error:(NSError *__autoreleasing *)error{
    NSError *localError = nil;

    NSDictionary *parsedObject = [ initWithDictionary: objectNotation];

    if (localError != nil) {
      *error = localError;
      return nil;
    }
    NSMutableArray *posts = [ init];

    NSArray *results = ;
    NSLog(@&#34;Count %lu&#34;, (unsigned long)results.count);

    for (NSDictionary *groupDic in results) {
      OCPost *post = [ init];
      post.body    = ;

      //1. Parse bodies
      NSArray *bodies = groupDic[@&#34;body&#34;];

      for (NSDictionary *aBody in bodies) {
            Body *body    = [ init];
            body.value    = aBody[@&#34;textId&#34;];
            body.name   = aBody[@&#34;type&#34;];
            body.metaData = [@[] mutableCopy];

            //2. Parse metadatas
            NSArray *metadatasOfBody = aBody[@&#34;metaData&#34;];

            for (NSDictionary *aMetadata in metadatasOfBody) {
                MetaData *metadata         = [ init];
                metadata.title               = aMetadata[@&#34;type&#34;];
                metadata.metaDataDescription = aMetadata[@&#34;value&#34;];

                //3. Add metadata to body
                ;
            }

            //4. Add body to post
            ;
      }

      //Logs to check post body and body metadata
      NSLog(@&#34;post %@&#34;, post);
      NSLog(@&#34;post body %@&#34;, post.body);

      for (Body *body in post.body) {
            NSLog(@&#34;post body metadata %@&#34;, body.metaData);
      }

      //5. Add post to posts
      ;
    }

    //Log to check return posts
    NSLog(@&#34;posts %@&#34;, posts);

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

<p>要对其进行测试,您可以将 JSON 表示为 NSDictionary,如下所示:</p>

<pre><code>- (NSDictionary*) aJSON
{
    return @{
      @&#34;message&#34;: @&#34;Post &#34;,
      @&#34;data&#34;: @[
               @{
               @&#34;postId&#34;: @1,
               @&#34;timestamp&#34;: @&#34;2016-06-14 22:37:02&#34;,
               @&#34;body&#34;: @[
                        @{
                        @&#34;textId&#34;: @1,
                        @&#34;type&#34;: @&#34;link&#34;,
                        @&#34;deleting&#34;: @false,
                        @&#34;metaData&#34;: @[
                                       @{
                                       @&#34;metadataId&#34;: @1,
                                       @&#34;type&#34;: @&#34;text&#34;,
                                       @&#34;value&#34;: @&#34;under &#34;
                                       }
                                       ]
                        },
                        @{
                        @&#34;textId&#34;: @2,
                        @&#34;type&#34;: @&#34;department&#34;,
                        @&#34;deleting&#34;: @false,
                        @&#34;metaData&#34;: @[
                                       @{
                                       @&#34;metadataId&#34;: @2,
                                       @&#34;type&#34;: @&#34;text&#34;,
                                       @&#34;value&#34;: @&#34;under &#34;
                                       }
                                       ]
                        }
                        ]
               }
               ]
      };
}
</code></pre>

<p>将 <code>objectNotation</code> 替换为 <code></code> 以便能够在不调用服务器 API 的情况下测试映射,当然也可以调用服务器 API 端点,并尝试使用响应进行测试JSON。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在对象内映射 JSON 数据对象?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37846858/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37846858/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在对象内映射 JSON 数据对象?