Инструмент командной строки для преобразования PLIST в JSON?
Есть ли инструмент командной строки для преобразования файлов .plist в JSON?
Если нет, то каким будет подход для создания одного с помощью Objective-C или C на Mac? Например, JSONKit для Objective-C. Как можно открыть файл .plist, передать его JSONKit и сериализовать его как JSON?
Ответы
Ответ 1
Если вы находитесь на Mac, вы можете использовать инструмент plutil в командной строке (это связано с инструментами разработчика, которые я считаю):
plutil -convert json Data.plist
как указано в комментариях, это перезапишет существующие данные. Для вывода в новый файл
plutil -convert json -o Data.json Data.plist
Ответ 2
Следующее выполняет задание —
// 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);
}
Он выполняет некоторую разумную проверку ошибок, но это не доказательство пули. Используйте на свой страх и риск.
Для создания инструмента вам понадобится JSONKit. Поместите JSONKit.m
и JSONKit.h
в ту же директорию, что и convertPlistToJSON.m
, а затем скомпилируйте с помощью:
shell% gcc -o convertPlistToJSON convertPlistToJSON.m JSONKit.m -framework Foundation
Использование:
shell% convertPlistTOJSON
usage: convertPlistToJSON FILE_PLIST FILE_JSON
shell% convertPlistTOJSON input.plist output.json
Считывает в input.plist
и записывает довольно печатный JSON в output.json
.
Ответ 3
Код довольно прост для этого:
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];
Я никогда не оборачивался, чтобы заставить его принимать аргументы, поскольку мне нужно было всего 3 файла.
Ответ 4
Я написал инструмент в python для этого. См. Здесь:
http://sourceforge.net/projects/plist2json
Работает из командной строки на os x или linux distros, пакетная конвертирует каталог. Он короткий и простой, поэтому его легко изменить в своих целях.
Ответ 5
Существует собственный способ преобразования plist
в json
. Он назывался NSJSONSerialization.
Вот пример того, как его использовать, и преобразуйте файл plist
в файл 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];
Ответ 6
Использование утилит mac
Конвертировать plist в json
plutil -convert json -o output.json input.plist
Преобразовать json в plist
plutil -convert xml1 input.json -o output.plist