2013-09-10 3 views
1

Я пытаюсь сгенерировать некоторый javascript из объекта C. У меня есть простой объект объектива-c: только NSString s, NSArray s, NSDictionary s, и NSNumber s - и мне бы хотелось для вставки его как литерала объекта в javascript. Каков наилучший способ сделать это?генерировать js объект литерал в объекте C

До сих пор мне удалось сериализовать объект и получить строку JSON, но JSON не совсем эквивалентен литералам объектов javascript. Я мог бы вставить его в качестве JSON.parse('%@') вызова, но это, кажется неэффективным:

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

Как вы создали JSON? –

+0

@jsumners: '[NSJSONSerialization dataWithJSONObject: параметры args: 0 error: & error];', then '[[[[NSString alloc] initWithData: utf8stringified encoding: NSUTF8StringEncoding] autorelease];' для получения 'NSString', затем [this] (http://stackoverflow.com/questions/15843570/objective-c-how-to-convert-nsstring-to-escaped-json-string), чтобы избежать его – Claudiu

+0

@Claudiu: Почему дополнительное ускорение? Разве NSJSONSerialization (преобразованный в NSString) не нужен? –

ответ

0

Вот полный код:

//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 литералов, но, видимо, это просто эти два символа Юникода!

Смежные вопросы