将包含NSDictionary对象的NSArray传递给Javascript函数

问题描述:

我有一个需求,其中包含NSArray中包含NSDictionary对象的大量信息。现在我必须将它们传递到一个JavaScript函数通过使用网页视图:将包含NSDictionary对象的NSArray传递给Javascript函数

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script 

我的问题是:

  1. 我如何在主叫端,使JavaScript能够理解它准备我的论点?
  2. 我如何在Javascript中接收它们?基本上,函数签名应该是什么,以及如何读取java函数内数组的字典对象的键 - 值对?

我对javascript基本上没有足够的经验,所以请原谅我,如果这个问题太抽象了,我希望我的问题很清楚!

编辑:我来到across a thread其中规定传递NSDictionary对象到JavaScript函数是不可能的。那么,我们该如何实现呢?

感谢&问候, 拉吉

既然你只能到-stringByEvaluatingJavaScriptFromString:提供一个字符串,你需要序列化的参数。最简单的方法是使用各种Cocoa JSON库之一将其转换为JSON。这可以作为JavaScript文字插入到您的代码中。喜欢的东西:

NSString *json = [serialize JSON here]; 
NSString *scriptString = [NSString stringWithFormat:@"doSomething(%@)", json]; 

在JSON中,NSDictionaries将被表示为JavaScript对象,所以你访问他们的成员array[5].someKey(或array[5]["some key"])。

+0

完美,谢谢!那么,还有一件事,JavaScrip对象究竟是什么? – 2011-04-20 08:16:52

你也可以rip'em'apart和字符串他们回来一起,like it looks this guys is doing....

function stringToNSString(str) { 
    return ['@"',str,'"'].join(''); 
} 
function numberToNSNumber(num) { 
    return ['[NSNumber numberWithLong:',num,']'].join(''); 
} 
function booleanToNSNumber(bool) { 
    return ['[NSNumber numberWithBool:',(bool ? 'YES' : 'NO'),']'].join(''); 
} 

function nullToNSNull(){ 
    return '[NSNull null]'; 
} 

function arrayToNSArray(array){ 
    var lines = _(array).map(function(value){ 
    var convertedValue; 
    if (_(value).isString()) { 
     convertedValue = stringToNSString(value); 
    } else if (_(value).isNumber()) { 
     convertedValue = numberToNSNumber(value); 
    } else if (_(value).isBoolean()) { 
     convertedValue = booleanToNSNumber(value); 
    } else if (_(value).isNull()) { 
     convertedValue = nullToNSNull(); 
    } else if (_(value).isArray()) { 
     convertedValue = arrayToNSArray(value); 
    } else if (typeof value === 'object') { 
     convertedValue = objectToNSDictionary(value); 
    } 
    return convertedValue; 
    }).map(function(value){ 
    return value + ', '; 
    }); 
    lines.unshift('[NSArray arrayWithObjects:'); 
    lines.push('nil]'); 
    return lines.join(''); 
} 
function objectToNSDictionary(obj){ 
    var lines = _(obj).map(function(value,key){ 
    var convertedValue; 
    if (_(value).isString()) { 
     convertedValue = stringToNSString(value); 
    } else if (_(value).isNumber()) { 
     convertedValue = numberToNSNumber(value); 
    } else if (_(value).isBoolean()) { 
     convertedValue = booleanToNSNumber(value); 
    } else if (_(value).isNull()) { 
     convertedValue = nullToNSNull(); 
    } else if (_(value).isArray()) { 
     convertedValue = arrayToNSArray(value); 
    } else if (typeof value === 'object') { 
     convertedValue = objectToNSDictionary(value); 
    } 
    return [convertedValue,stringToNSString(key)]; 
    }).map(function(valueKey){ 
    valueKey.push(''); 
    return valueKey.join(','); 
    }); 
    lines.unshift('[NSDictionary dictionaryWithObjectsAndKeys:'); 
    lines.push('nil]'); 
    return lines.join('\n'); 
} 

我是LOT聪明现在...☺和我认为 - 可能,也许... that this (JSONKit on GitHub)是一个更好的解决方案.... JSONKit提供以下基本类型映射到以下Objective-C基础类:

╭───────────────┬─────────────────────╮ 
│ JSON   │ Objective -C  │ 
├───────────────┼─────────────────────┤ 
│ true|false │ NSNull    │ 
├───────────────┼─────────────────────┤ 
│ Number  │ NSNumber   │ 
├───────────────┼─────────────────────┤ 
│ String  │ NSString   │ 
├───────────────┼─────────────────────┤ 
│ Array  │ NSArray   │ 
├───────────────┼─────────────────────┤ 
│ Object  │ NSDictionary  │ 
╰───────────────┴─────────────────────╯ 

对象Associative ArraysKey/Value Hash TablesMaps,或Dictionaries

JSONKit使用核心基础,在内部,并且它假定该核心基础≡基金会每当量的碱的类型,即CFString字符串≡的NSString 。还要注意,他们它不是ARC安全的。