如何将包含 JSON 的 JSON NSString 从 Objective C 方法传递给 Javascript 方法

Posted

技术标签:

【中文标题】如何将包含 JSON 的 JSON NSString 从 Objective C 方法传递给 Javascript 方法【英文标题】:How to Pass JSON NSString containing JSON to a Javascript Method from an Objective C method 【发布时间】:2013-01-07 14:53:41 【问题描述】:

我有一个要求,objective C code should 使用 WebService 并且在 JSON format 中收到的响应必须作为参数传递给 javascript 方法以进行进一步处理。我正在使用 UIWebView 这将处理后显示相应的结果JSON response. 当我尝试将 JSON 字符串传递给 Javascript 方法时出现问题。Javascript 方法不简单地接受输入。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSString *responseString = [[NSString alloc] initWithBytes:[resultData bytes] length:[resultData length] encoding:NSUTF8StringEncoding];
    NSLog(@"%@",responseString);
    [self returnResponseToJavaScriptMethods:responseString];



-(void)returnResponseToJavaScriptMethods:(NSString*)theResponse
    [viewMainWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"retrieveServerResponse('%@')",theResponse]];

我有什么遗漏的吗?使用相同的方法可以正确传递简单的字符串。

更新: 将responseData 编码为UTF8StringEncoding 就可以了。

[theResponse stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]

【问题讨论】:

【参考方案1】:

您可能需要在将 JSON 字符串发布到 javascript 之前对其进行 URL 转义。

尝试改变:

-(void)returnResponseToJavaScriptMethods:(NSString*)theResponse
  [viewMainWebView stringByEvaluatingJavaScriptFromString:
  [NSString stringWithFormat:@"retrieveServerResponse('%@')",theResponse]];

-(void)returnResponseToJavaScriptMethods:(NSString*)theResponse
  [viewMainWebView stringByEvaluatingJavaScriptFromString:
  [NSString stringWithFormat:@"retrieveServerResponse('%@')",
 [theResponse stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
 

看看这是否对你有帮助。但是请注意,有更好(或更可靠)的方法来转义字符串,例如在此答案中给出的方法:How do I URL encode a string

【讨论】:

非常感谢您的建议。它就像一个魅力。但是现在我们用转义字符填充的字符串需要清理以转换为正确的 JSON 响应。这给了我另一个头痛。如果您知道一种在 javascript 中完美反转编码的方法,请在 cmets 中提及。 我不知道它是否“完美”,但是您尝试过unescape()功能吗?它应该可以工作,只是unescape(your_escaped_json_string) 我改变了我的编码方法。我只是使用 Base64 编码对其进行编码/解码。【参考方案2】:

在 javascript 中不需要 retrieveServerResponse(),只需在 ios 中对字符串进行百分比转义后使用 unescape(percentEscapedStringFromiOS)

NSString *encodedString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// CAVEAT: unescape(\"%@\") is important since "'" (single quote) isn't excaped by the above function!
NSString *jsString = [NSString stringWithFormat:@"myJSstring = unescape(\"%@\")", encodedString]];

NSString *jsResult = [self.webView stringByEvaluatingJavaScriptFromString:jsString];

【讨论】:

以上是关于如何将包含 JSON 的 JSON NSString 从 Objective C 方法传递给 Javascript 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?

如何将包含逗号分隔的 json 值的单个字符串转换为单个 json 对象?

如何将包含 JSON 的 JSON NSString 从 Objective C 方法传递给 Javascript 方法

如何将包含 JSON 的输入 CSV 数据转换为 spark 数据集?

如何将文件与包含有关文件的附加信息的对象的 json 一起上传?

如何将包含数组的 JSON 表迁移到 SQL?