用于将PLIST转换为JSON的命令行工具?


67

是否有命令行工具可用于将.plist文件转换为JSON?

如果不是,在Mac上使用Objective-C或C创建一个的方法是什么?例如,有用于Objective-C的JSONKit。如何打开一个.plist文件,将其传递给JSONKit,然后将其序列化为JSON?

Answers:


164

如果您使用的是Mac,则可以在命令行上使用plutil工具(我相信这是开发人员工具附带的工具):

plutil -convert json Data.plist

如评论中所述,这将覆盖现有数据。输出到新文件

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

14
这将覆盖原始plist。为防止此命令覆盖原始文件,请传递该-o标志。即plutil -convert json Data.plist -o Data.json
ADAM

2
这样做的一个复杂之处是,某些Plist数据类型不能由plutil转换。我发现的解决方法是在将plist传递给plutil之前对plist进行一些预处理。特定于我正在使用的plist,我必须将<data><date>标签都替换为<string>
丹迪恩

1
您的第二个命令将完全转换原始plist文件。应该是plutil -convert json -o Data.json Data.plist。也就是说,原始plist文件应该位于最后。@ADAM
DawnSong

1
使用plutil -convert -r json以接收在一个人类可读的格式的JSON
马塞尔Zanoni

1
传递连字符作为输出文件以打印到stdout。plutil -convert json -o - file.json
BallpointBen

5

以下完成工作—

// 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


2

该代码非常简单:

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个文件。



2

有一种本地方法,可以将转换plistjson。这称为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];


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.