是否有命令行工具可用于将 .plist 文件转换为 JSON?
如果没有,在 Mac 上使用 Objective-C 或 C 创建一个的方法是什么?例如,有用于 Objective-C 的 JSONKit。如何打开 .plist 文件,将其传递给 JSONKit,并将其序列化为 JSON?
如果您使用的是 Mac,您可以在命令行上使用 plutil 工具(我相信这是开发人员工具附带的):
plutil -convert json -o Data.json Data.plist
如果您只想覆盖现有文件,可以省略
-o
参数:
plutil -convert json Data.plist
以下内容即可完成工作—
// 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
。
如果遇到“plist 中目标格式的对象无效”问题,则 plist 中可能有类似字节的数据,plutil 不认为该数据可序列化为 json。
Python 有内置的 plist 支持,我们可以指定一个自定义的默认函数来指定序列化失败时要执行的操作(例如,在字节上)。如果你不关心字节字段,我们可以使用以下 python 单行代码将它们序列化为
'<not serializable>'
:
python -c 'import plistlib,sys,json; print(json.dumps(plistlib.loads(sys.stdin.read().encode("utf-8")), default=lambda o:"<not serializable>"))'
这需要 stdin,解析 plist,然后将其转储为 json。例如,要获取 Mac 的当前电源信息,您可以运行:
ioreg -rw0 -c AppleSmartBattery -a | python -c 'import plistlib,sys,json; print(json.dumps(plistlib.loads(sys.stdin.read().encode("utf-8")), default=lambda o:"<not serializable>"))'
如果您只想获取当前的充电功率,您可以将其输入
jq '.[0].AdapterDetails.Watts'
使用 mac utils
plutil -convert json -o output.json input.plist
plutil -convert xml1 input.json -o output.plist
执行此操作的代码相当简单:
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 个文件。
我用 python 编写了一个工具来做到这一点。请看这里:
http://sourceforge.net/projects/plist2json
在 os x 或 linux 发行版上通过命令行工作,批量转换目录。它简短而简单,因此应该很容易根据您自己的目的进行修改。
有一种原生方法可以将
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];
将
Filename.plist
转换为 Filename.json
:
plutil -convert json -r -e json Filename.plist
-convert
表示格式,-r
使输出更易于阅读,-e
指定扩展名