将包含NSArray的NSDictionary转换为JSON

时间:2014-05-11 21:54:09

标签: objective-c json nsarray nsdictionary nsjsonserialization

我有NSDictionary包含几个不同的对象,其中包含NSArray

数组中的元素是NSDictionary - 自定义对象的表示。为简单起见,我重命名了属性并删除了其他属性。

首先,我尝试像这样简单地序列化NSArray,只是为了看看它会是什么样子:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:&writeError];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

结果如下所示,这是我的预期:

[
  {
    "someProperty" : "Value 1"
  },
  {
    "someProperty" : "Value 2"
  }
]

然而,当我将(未编码的)数组添加到NSDictionary并序列化时,数组看起来不同:

NSMutableArray *myArray = [NSMutableArray array];
[myArray addObject:[object1 dictionaryRepresentation]]; // dictionaryRepresentation returns a NSDictionary
[myArray addObject:[object2 dictionaryRepresentation]];

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:myArray forKey:@"myArray"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&writeError];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

现在结果如下:

{
  myArray =     (
                  {
            "someProperty" : "Value 1"
        },
                  {
            "someProperty" : "Value 2"
        }
  );
}

而不是获得"myArray" : [...]我得到的myArray = (...);不是正确的JSON表示。

将{J}表示添加到字典中时,使用NSArray的JSON表示的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

在第一种情况下,您将打印出JSON编码操作的结果。

在第二种情况下,您是通过NSLog直接打印字典而不是其JSON表示。

<强>更新

要查看此信息,请使用此日志记录功能代替NSLog

void logThisObject(id obj)
{
    if(obj == nil) {
        NSLog(@"logObject: nil");
    } else {
        NSString *className = NSStringFromClass([obj class]);
        NSLog(@"logObject: an %@: %@", className, obj);
    }
}

更新2:

void test_it()
{
    NSArray *myArray = @[@"bla", @"foo"];
    NSError *writeError = nil;

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    [dictionary setObject:myArray forKey:@"myArray"];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&writeError];
    if(writeError) {
        NSLog(@"an error happened: %@", writeError);
    }
    logThisObject([[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
}

这会输出正确的JSON字符串:

logObject: an __NSCFString: {
  "myArray" : [
    "bla",
    "foo"
  ]
}