Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将包含NSArray的NSDictionary转换为JSON_Objective C_Json_Nsarray_Nsdictionary_Nsjsonserialization - Fatal编程技术网

Objective c 将包含NSArray的NSDictionary转换为JSON

Objective c 将包含NSArray的NSDictionary转换为JSON,objective-c,json,nsarray,nsdictionary,nsjsonserialization,Objective C,Json,Nsarray,Nsdictionary,Nsjsonserialization,我有一个NSDictionary包含几个不同的对象,其中有一个NSArray 数组中的元素是自定义对象的表示形式。为了简单起见,我已经重命名了属性并删除了一些其他属性 首先,我尝试像这样简单地序列化NSArray,看看它会是什么样子: NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:&writeError]; NSLog(

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

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

首先,我尝试像这样简单地序列化
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表示形式


NSArray
添加到字典时,如何正确使用它的JSON表示?

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

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

更新:

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]);
}
要查看此信息,请使用此日志记录功能,而不是使用
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"
  ]
}

第二种情况与您从字典/数组的NSLog中看到的情况并不完全相同,但我认为OP只是近似于该情况下结果的外观。实际输出应该是
=
,而不是
,并且在不包含任何空格或非字母字符的字符串周围没有引号。@HotLicks第二种情况是我从包含的代码中得到的。
myArray
中的元素是自定义对象的表示形式。不过,为了简单起见,我确实重命名了属性并删除了一些其他属性。@Michael,我在第二种情况下打印的是字典的赋形JSON(当然是转换为
NSString
)。但是,当我将
NSArray
添加到
NSDictionary
时,我假设它使用的数组表示形式与
NSLog
使用的数组表示形式相同,因此结果看起来是一样的。我需要知道的是,在将其添加到字典时,如何正确使用
NSArray
的JSON表示。@NobleK:我更新了我的答案。似乎您正在对字典进行JSON编码,扔掉结果,然后打印出未编码的字典。也许你可以用一段独立的代码重现这个问题,我可以将它复制粘贴到Xcode中?今天再次查看我的代码,我发现你实际上是正确的,因为在我大量的控制台日志记录中,我实际上看到了错误的输出。我在问题中提供的(以及让我相信存在问题的原因)实际上来自
NSDictionary
的直接输出,而不是JSON表示。感谢您的帮助,并为我的固执道歉。对于您扭曲的“现在”结果,最好(尽管不是完美的)解释是,您从第一个字典中获取编码的JSON,转换为NSString,然后将其添加到第二个字典中。这不是应该怎么做的。您应该将第一个字典本身(而不是它的JSON表示)添加到第二个字典中。所有内容都应该同时进行JSON编码,只需一次操作(如果您向我们展示编码代码,包括生成上述输出的NSLog语句,这会有所帮助。)我相信我现在理解了这种混淆。它可能看起来像是我从第一个代码片段中提取了
NSArray
,并将其添加到我的
NSDictionary
(在第二个代码片段中)。事实上,这两个代码段根本没有一起使用。正如我在问题中所解释的,我只使用了第一个代码片段中的代码来测试
NSArray
的序列化效果。现在,我提供了额外的代码行来解释我对数组实际执行的操作。我为其中的含混不清表示歉意。问题是,上面最后列出的“JSON”不是有效的JSON,也不是在NSLogging上看到的表示有效JSON的NSDictionary。请注意,“myArray”不带引号,后跟
=
,与字典的NSLog一致,而“someProperty”带引号,后跟
,与JSON一致。您没有向我们显示真实的数据。(JSON“对象”包含带引号的键值,并使用
分隔键值。NSDictionary的NSLog仅在键值包含非字母字符时引用键值,并使用
=
分隔键值。此外,JSON“对象”由
[]括起
,而字典的NSLog将字典括在
()