2011-05-20 17 views
55

¿Hay una herramienta de línea de comandos disponible para convertir archivos .plist a JSON?Herramienta de línea de comandos para convertir PLIST a JSON?

Si no, ¿cuál sería el enfoque para crear uno usando Objective-C o C en una Mac? Por ejemplo, hay JSONKit, para Objective-C. ¿Cómo podría uno abrir un archivo .plist, pasarlo a JSONKit y serializarlo como JSON?

Respuesta

139

Si usted está en un Mac puede utilizar la herramienta de plutil en la línea de comandos (esto viene con las herramientas de desarrollo creo):

plutil -convert json Data.plist 

como se menciona en los comentarios, esto va a sobrescribir los datos existentes . Para dar salida a un nuevo archivo

plutil -convert json -o Data.json Data.plist 
+14

Esto sobrescribirá el plist originales. Para evitar que este comando sobrescriba el archivo original, pase el indicador '-o'. es decir 'plutil -convert json Data.plist -o Data.json' – ADAM

+2

Una complicación con esto es que algunos tipos de datos Plist no se pueden convertir por plutil. La solución alternativa que encontré fue hacer un preprocesamiento en el plist antes de pasarlo a plutil. Específico para el plist con el que estoy trabajando, tuve que reemplazar las etiquetas '' y '' con ''. – dandean

+0

No sé en qué Mac se supone que debe funcionar, pero en 10.6 dice: 'Especificador de formato desconocido: json' – Tobia

2

El código es bastante simple de hacer esto:

NSArray* array = [[NSArray arrayWithContentsOfFile:[@"~/input.plist" stringByExpandingTildeInPath]]retain]; 
SBJsonWriter* writer = [[SBJsonWriter alloc] init]; 
NSString* s = [[writer stringWithObject:array] retain]; 
[s writeToFile:[@"~/output.json" stringByExpandingTildeInPath] atomically:YES]; 
[array release]; 

nunca llegó a hacerlo por lo que es aceptar los argumentos, ya que sólo tenía que hacer 3 archivos.

5

A continuación se realiza el trabajo —

// convertPlistToJSON.m 
#import <Foundation/Foundation.h> 
#import "JSONKit.h" 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    if(argc != 3) { fprintf(stderr, "usage: %s FILE_PLIST FILE_JSON\n", argv[0]); exit(5); } 

    NSString *plistFileNameString = [NSString stringWithUTF8String:argv[1]]; 
    NSString *jsonFileNameString = [NSString stringWithUTF8String:argv[2]]; 

    NSError *error = NULL; 

    NSData *plistFileData = [NSData dataWithContentsOfFile:plistFileNameString options:0UL error:&error]; 
    if(plistFileData == NULL) { 
    NSLog(@"Unable to read plist file. Error: %@, info: %@", error, [error userInfo]); 
    exit(1); 
    } 

    id plist = [NSPropertyListSerialization propertyListWithData:plistFileData options:NSPropertyListImmutable format:NULL error:&error]; 
    if(plist == NULL) { 
    NSLog(@"Unable to deserialize property list. Error: %@, info: %@", error, [error userInfo]); 
    exit(1); 
    } 

    NSData *jsonData = [plist JSONDataWithOptions:JKSerializeOptionPretty error:&error]; 
    if(jsonData == NULL) { 
    NSLog(@"Unable to serialize plist to JSON. Error: %@, info: %@", error, [error userInfo]); 
    exit(1); 
    } 

    if([jsonData writeToFile:jsonFileNameString options:NSDataWritingAtomic error:&error] == NO) { 
    NSLog(@"Unable to write JSON to file. Error: %@, info: %@", error, [error userInfo]); 
    exit(1); 
    } 

    [pool release]; pool = NULL; 
    return(0); 
} 

Lo hace algunas comprobaciones de error razonable, pero no es a prueba de balas. Úselo bajo su propio riesgo.

Necesitará JSONKit para construir la herramienta. Coloque JSONKit.m y JSONKit.h en el mismo directorio que convertPlistToJSON.m, y luego compilar con:

shell% gcc -o convertPlistToJSON convertPlistToJSON.m JSONKit.m -framework Foundation 

Uso:

shell% convertPlistTOJSON 
usage: convertPlistToJSON FILE_PLIST FILE_JSON 

shell% convertPlistTOJSON input.plist output.json 

lee en input.plist, y escribe el JSON bastante impresa a output.json.

2

Escribí una herramienta en python para hacer esto. Ver aquí:

http://sourceforge.net/projects/plist2json

Obras de línea de comandos en OS X o distribuciones de Linux, lotes convierte un directorio. Es corto y simple, por lo que debería ser fácil modificarlo para sus propios fines.

2

Hay una forma nativa, para convertir plist 's a json. Se llama NSJSONSerialization.

Aquí es un ejemplo de cómo usarlo, y convertir un archivo a un archivo plistjson:

NSDictionary *plistDict = [NSDictionary dictionaryWithContentsOfFile:@"input.plist"]; 

NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:plistDict options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
[jsonString writeToFile:@"output.json" atomically:NO encoding:NSUTF8StringEncoding error:&error]; 
Cuestiones relacionadas