【问题标题】:generate js object literal in objective C在目标C中生成js对象文字
【发布时间】:2013-09-10 20:31:17
【问题描述】:

我正在尝试从目标 C 生成一些 javascript。我有一个简单的目标 C 对象:只有 NSStrings、NSArrays、NSDictionarys 和 NSNumbers - 我会喜欢将它作为对象文字插入到javascript中。最好的方法是什么?

到目前为止,我已经成功地序列化了对象并获得了 JSON 字符串,但 JSON 并不完全等同于 javascript 对象文字。我可以将其作为JSON.parse('%@') 调用插入,但这似乎效率低下:

(controller.createWindow).apply((controller), JSON.parse('[\"LoggedIn\",3,1,[0,0,480,320],false,false]'))

【问题讨论】:

  • 你是如何生成 JSON 的?
  • @jsumners: [NSJSONSerialization dataWithJSONObject:args options:0 error:&error];,然后[[[NSString alloc] initWithData:utf8stringified encoding:NSUTF8StringEncoding] autorelease]; 得到NSString,然后this 转义它
  • @Claudiu:为什么要额外转义? NSJSONSerialization(转换成NSString)不是你需要的吗?
  • @MartinR:JSON: The JavaScript subset that isn't。哦,虽然我记得以前经历过这个,解决方案就是替换那些字符......嗯,是的,这更简单
  • @MartinR:据我所知.. 我记得以前解决过这个问题,我已经使用 python 等效于我在下面发布的解决方案几个月没有遇到问题

标签: javascript objective-c json literals object-literal


【解决方案1】:

这是完整的代码:

//turn an NSObject into an NSString
+ (NSString *)jsonDumps:(id)obj {
    NSError *error;
    NSData *utf8stringified = [NSJSONSerialization dataWithJSONObject:obj options:0 error:&error];
    if (utf8stringified == nil) {
        [NSException raise:@"Failed to jsonify arguments" format:@"Failed to jsonify arguments %@: %@",
         obj, error];
    }

    NSString *stringified = [[[NSString alloc] initWithData:utf8stringified encoding:NSUTF8StringEncoding]
                             autorelease];
    return stringified;
}

//turn a JSON string into a JS literal
+(NSString *)jsonToJSLit:(NSString *)jsonString {
    NSMutableString *s = [NSMutableString stringWithString:jsonString];
    [s replaceOccurrencesOfString:@"\u2028" withString:@"\\u2028" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\u2029" withString:@"\\u2029" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    return [NSString stringWithString:s];
}

//turn an object into a JS string literal
+(NSString *)objToJSLiteral:(id)obj {
    return [self jsonToJSLit:[self jsonDumps:obj]];
}

我认为 JSON 和 JS 文字之间的区别更大,但显然它只是那两个 unicode 字符!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多