79 votes

Outil en ligne de commande pour convertir PLIST en JSON?

Y a-t-il un outil en ligne de commande disponible pour convertir des fichiers .plist en JSON?

Si ce n'est pas le cas, quelle serait l'approche pour en créer un en utilisant Objective-C ou C sur un Mac? Par exemple, il y a JSONKit pour Objective-C. Comment ouvrir un fichier .plist, le passer à JSONKit et le sérialiser en JSON?

184voto

Dylan Points 1087

Si vous utilisez un Mac, vous pouvez utiliser l'outil plutil en ligne de commande (qui fait partie des outils de développement, je crois) :

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

Si vous voulez simplement écraser le fichier existant, vous pouvez omettre le paramètre -o :

plutil -convert json Data.plist

19 votes

Cela écrasera le plist original. Pour empêcher cette commande d'écraser le fichier original, passez le drapeau -o. c'est-à-dire plutil -convert json Data.plist -o Data.json

2 votes

Une complication avec cela est que certains types de données Plist ne peuvent pas être convertis par plutil. La solution de contournement que j'ai trouvée a été de faire un prétraitement sur le fichier plist avant de le passer à plutil. Plus précisément pour le plist sur lequel je travaille, j'ai dû remplacer à la fois les balises et par .

0 votes

Je ne sais pas sur quels Macs cela est censé fonctionner, mais sur 10.6 il indique : Format spécifié inconnu : json

5voto

johne Points 5957

Le code suivant permet de faire le travail —

// convertPlistToJSON.m
#import 
#import "JSONKit.h"

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

  if(argc != 3) { fprintf(stderr, "utilisation: %s FICHIER_PLIST FICHIER_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(@"Impossible de lire le fichier plist. Erreur: %@, info: %@", error, [error userInfo]);
    exit(1);
  }

  id plist = [NSPropertyListSerialization propertyListWithData:plistFileData options:NSPropertyListImmutable format:NULL error:&error];
  if(plist == NULL) {
    NSLog(@"Impossible de désérialiser la liste de propriétés. Erreur: %@, info: %@", error, [error userInfo]);
    exit(1);
  }

  NSData *jsonData = [plist JSONDataWithOptions:JKSerializeOptionPretty error:&error];
  if(jsonData == NULL) {
    NSLog(@"Impossible de sérialiser le plist en JSON. Erreur: %@, info: %@", error, [error userInfo]);
    exit(1);
  }

  if([jsonData writeToFile:jsonFileNameString options:NSDataWritingAtomic error:&error] == NO) {
    NSLog(@"Impossible d'écrire le JSON dans le fichier. Erreur: %@, info: %@", error, [error userInfo]);
    exit(1);
  }

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

Cela effectue une vérification raisonnable des erreurs, mais ce n'est pas infaillible. Utilisez à vos risques et périls.

Vous aurez besoin de JSONKit pour compiler l'outil. Placez JSONKit.m et JSONKit.h dans le même répertoire que convertPlistToJSON.m, puis compilez avec:

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

Utilisation:

shell% convertPlistTOJSON
utilisation: convertPlistToJSON FICHIER_PLIST FICHIER_JSON

shell% convertPlistTOJSON input.plist output.json

Lit input.plist, et écrit le JSON joliment imprimé dans output.json.

2voto

skorulis Points 2736

Le code est assez simple pour faire cela:

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];

Je n'ai jamais eu le temps de le faire accepter des arguments car je n'avais besoin de traiter que 3 fichiers.

2voto

Rab Points 2240

J'ai écrit un outil en python pour faire cela. Voir ici:

http://sourceforge.net/projects/plist2json

Fonctionne en ligne de commande sur les systèmes d'exploitation os x ou les distributions linux, convertit en lot un répertoire. C'est court et simple donc il devrait être facile à modifier pour vos propres besoins.

2voto

Leandros Points 5916

Il existe un moyen natif de convertir les plist en json. Cela s'appelle NSJSONSerialization.

Voici un exemple de comment l'utiliser et convertir un fichier plist en fichier json:

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];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X