如何返回 NSJsonSerialization

Posted

技术标签:

【中文标题】如何返回 NSJsonSerialization【英文标题】:How can I return NSJsonSerialization 【发布时间】:2018-01-12 19:22:40 【问题描述】:

首先,我对 Objective-C 一无所知。

也就是说,下面的代码应该是从 AsyncStorage 获取数据。

我已经为android 做过类似的事情,其基本思想是从 AsyncStorage 获取数据作为 Json 对象。

我现在需要的是在callInviteReceived 中使用jsonFromLocalRNStrogeForKey

jsonFromLocalRNStrogeForKey source

+(void)jsonFromLocalRNStrogeForKey:(NSString *)key completion:(void (^)(NSDictionary * _Nullable, NSError * _Nullable))completion

    RCTResponseSenderBlock rnCompletion = ^(NSArray *response) 

        NSString *jsonAsString;

        if (response.count > 1) 
            NSArray *response1 = response[1];
            if (response1.count > 0) 
                NSArray *response2 = response1[0];                
                if (response2.count > 1) 
                    jsonAsString = response2[1];
                
            
        

        NSData *jsonAsData = [jsonAsString dataUsingEncoding:NSUTF8StringEncoding];

        NSError *error;

        NSDictionary *json = [
            NSJSONSerialization
            JSONObjectWithData:jsonAsData
            options:NSJSONReadingMutableContainers
            error:&error
        ];

        completion(json, error);
    ;

    RCTAsyncLocalStorage *storage = [RCTAsyncLocalStorage new];   

    dispatch_async(storage.methodQueue, ^
        [storage performSelector:@selector(multiGet:callback:) withObject:@[key] withObject:rnCompletion];
    );

callInviteReceived

- (void)callInviteReceived:(TVOCallInvite *)callInvite     
    NSJsonSerialization json = [self.jsonFromLocalRNStrogeForKey];
    // json.user.name
    [self reportIncomingCallFrom:@json.user.name withUUID:callInvite.uuid];

这些方法应该像

-(NSJsonSerialization)jsonFromLocalRNStrogeForKey: 
    ...
    return json;


- (void)callInviteReceived     
    ...

    NSJsonSerialization json = [self.jsonFromLocalRNStrogeForKey];

    // json.user.name
    [self reportIncomingCallFrom:json.user.name withUUID:callInvite.uuid];

那么,有没有人可以告诉我,如何编码?


Using RCTAsyncLocalStorage + getAllKeys

【问题讨论】:

【参考方案1】:

代码如下所示(您需要提供storageKey 参数):

- (void)callInviteReceived:(TVOCallInvite *)callInvite     
    [self jsonFromLocalRNStrogeForKey:/*storageKey*/ completion:^(NSDictionary* data,NSError* error)
        if(data)
            NSString * name = [data valueForKeyPath@"user.name"];
            if(![name isKindOfClass:[NSNull class]])
                [self reportIncomingCallFrom:name withUUID:callInvite.uuid];
            
        else
            //handle error
            NSLog(@"JSON Parsing Error: %@",error.localizedDescription)
        
   

NSJSONSerialization 是一个工具类,负责对 JSON 进行序列化和反序列化。它的所有方法都是类方法,所以将它作为返回值传递是没有意义的。

反序列化的输出是NSDictionary,它是 JSON 的 Map 表示。您可以使用此 Map 提取 user.name 的值。

【讨论】:

成功了!非常感谢!顺便说一句,您知道是否有特定的storageKey 作为 root 用户吗?因为每次尝试我都会为空。我也试过getAllKeys,但我不存在。 请更新您的问题以包含您用于getAllKeys 的代码。 getAllKeys 是一个带有RCTResponseSenderBlock 的方法。使用NSLog 打印RCTResponseSenderBlock 中返回的数组的内容。 github.com/gpbl/react-native-blur-example/blob/master/… 当然,刚刚做到了!再次感谢您。 您错误地调用了getAllKeys。请将此作为单独的问题发布,以避免混乱。您可以在此处粘贴该问题的链接,我会回答。一旦getAllKeys 工作,您将拥有一个密钥列表,您可以在jsonFromLocalRNStrogeForKey:completion 中使用适当的密钥 这里是***.com/questions/48280006/…

以上是关于如何返回 NSJsonSerialization的主要内容,如果未能解决你的问题,请参考以下文章

js 如何创建带返回值的函数

Android开发如何点击物理返回键返回上个界面

请问Ajax如何获取回调函数的返回值?

请求正常时如何返回json对象,SpringBoot失败时如何返回json错误对象

如何获取AsyncTask 异步处理的返回值

如何在 Pycharm 中输入提示“不返回的返回类型”