我正在尝试打印出我保存在层次结构中的多个字典中的对象化 JSON 结构。我想通过 NSObject 的description
方法来做到这一点,以便每个嵌套字典的描述方法也被调用并返回其值。
期望的结果
//First Hierarchal Level
//Second Hierarchal Level
//Third Hierarchal Level
People =
(
{
Name = Person 1
Gender = Male
Addresses =
(
{
Address Name = Home Address
Street = 123 Street St.
City = NewCity
State = AZ
Zip = 12345
Country = USA
}
)
Cars =
(
{
Make = Ford
Model = NewFord
Insured Drivers =
(
{
Name = Person 1
},
{
Name = Person 2
}
)
}
)
}
)
//NOTE: Sample untested nested structure
但是,我遇到了一个问题,即每个嵌套字典的返回字符串对于返回字符串通过的层次结构的每个级别都被转义一次。
实际结果
People = \n (\n {\n Name = Person 1\\\n Gender = Male\\\n Addresses =\\\n ( \\\n {\\\n Address Name = Home Address\\\n Street = 123 Street St.\\\n City = NewCity\\\n State = AZ\\\n Zip = 12345\\\n Country = USA\\\n }\\\n )\\\n Cars = \\\n ( \\\n {\\\\\\\n Make = Ford\\\\\\\n Model = NewFord\\\\\\\n Insured Drivers = \\\\\\\n (\\\\\\\n {\\\\\\\\\\\\\n Name = Person 1\\\\\\\\\\\\\n },\\\\\\\\\\\\\n {\\\\\\\\\\\\\n Name = Person 2\\\\\\\\\\\\\n }\\\\\\\n )\\\\\\\n }\\\n ) \n }\n )
我已经读到这与描述如何添加这些转义字符有关,因为它使用了类似 syslog 实用程序的东西,但是我相信我想要的功能是可用的,因为 NSArray 如何以与我想。我尝试遍历结果字符串并解析转义字符,但到目前为止,我想出的最好结果是所有字典中所有属性的非分层列表。
最佳尝试
People =
(
{
Name = Person 1
Gender = Male
Addresses =
(
{
Address Name = Home Address
Street = 123 Street St.
City = NewCity
State = AZ
Zip = 12345
Country = USA
}
)
Cars =
(
{
Make = Ford
Model = NewFord
Insured Drivers =
(
{
Name = Person 1
},
{
Name = Person 2
}
)
}
)
}
)
我想知道是否有其他人遇到过这个问题以及他们是如何克服它的。
欢迎任何和所有建议。感谢您的关注。
更新 1:根据评论中的建议,我尝试使用以下 NSDictionary 类别方法将我的字典对象解析为 JSON 字符串以进行打印:
-(NSString*)JSONDescription
{
NSError *error;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error];
NSString* json = nil;
if (! jsonData) {
NSLog(@"WARNING: NSDictionary JSONDescription encountered error \"%@\"", error);
} else {
json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
return json;
}
然后,在我的层次结构的每一层,我JSONDescription
在每个description
方法中调用我的字典对象。但是,似乎没有description
调用嵌套对象的方法。这导致以下异常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Address)'
示例实现
#import "Person.h"
#define NAME @"Name"
#define GENDER @"Gender"
#define ADDRESSES @"Addresses"
#define CARS @"Cars"
@implementation Person
-(NSDictionary*)toDictionary{
return @{ NAME: self.name,
GENDER: self.gender,
ADDRESSES: self.addresses,
CARS: self.cars};
}
-(NSString*)description{
return self.toDictionary.JSONDescription;
}
@end
#import "Address.h"
#define ADDRESS_NAME @"Address Name"
#define STREET @"Street"
#define CITY @"City"
#define STATE @"State"
#define ZIP @"Zip"
#define COUNTRY @"Country"
@implementation Address
-(NSDictionary*)toDictionary{
return @{ ADDRESS_NAME: self.addressName,
STREET: self.street,
CITY: self.city,
STATE: self.state,
ZIP: self.zip,
COUNTRY: self.country};
}
-(NSString*)description{
return self.toDictionary.JSONDescription;
}
@end
#import "Car.h"
#define MAKE @"Make"
#define MODEL @"Model"
#define INSURED_DRIVERS @"Insured Drivers"
@implementation Car
-(NSDictionary*)toDictionary{
return @{ MAKE: self.make,
MODEL: self.model,
INSURED_DRIVERS: self.drivers};
}
-(NSString*)description{
return self.toDictionary.JSONDescription;
}
@end
#import "Driver.h"
#define NAME @"Name"
@implementation Car
-(NSDictionary*)toDictionary{
return @{ NAME: self.name};
}
-(NSString*)description{
return self.toDictionary.JSONDescription;
}
@end