Próbuję wydrukować zobiektywizowaną strukturę JSON, którą zapisuję w wielu słownikach w hierarchii. Chciałbym to zrobić za pomocą metody NSObject description
, aby każda metoda opisowa zagnieżdżonego słownika została wywołana, zwracając również jego wartość.Zagnieżdżone NSDictionary Opis Escape Character Problems
pożądanego rezultatu
//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
Jednakże I zostały uruchomione do problemu, że ciąg zwrotny dla każdego zagnieżdżonego słownika jest coraz uciekł raz dla każdego poziomu hierarchii, że ciąg zwrotny zostaje przekazana przez.
Rzeczywista Wynik
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)
Czytałem, że ma to związek z tym, jak opis dodaje te znaki ewakuacyjne ze względu na jego użyciu coś jak syslog użyteczności, jednak wierzę, że funkcje, które pragnę jest dostępny ze względu na to, jak NSArray opisuje jego zawartość w podobny sposób, jak chciałbym. Próbowałem iterować ciąg wyniku i analizowanie znaków escape, ale jak dotąd najlepszym wynikiem, jaki wymyśliłem, jest niehierarchiczna lista wszystkich właściwości we wszystkich słownikach.
Najlepsza próba
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
}
)
}
)
}
)
Zastanawiałem się, czy ktoś inny nie natknąć się ten problem i jak go pokonaliśmy.
Wszelkie sugestie są mile widziane. Dzięki za spojrzenie.
UPDATE 1: Zgodnie z radą w komentarzach, próbowałem parsowania Mój słownik obiektów do ciągów JSON do drukowania za pomocą następującego NSDictionary metodę kategorii:
-(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;
}
Następnie na każdym poziomie mojego hierarchii, nazywam obiekt mojego obiektu słownikowego JSONDescription
w każdej metodzie description
. Jednak nie wygląda na to, że wywoływana jest metoda zagnieżdżonego obiektu description
. To powoduje następujące wyjątki:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Address)'
przykładów realizacji
#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
Jestem nieco zdezorientowany bo czasami pokazać „klucz = wartość” (jak w słowniku), a czasami „klucz: wartość” (jak w JSON) w swoich przykładach.Który chcesz na wyjściu? - Czy możesz pokazać swój kod, który wyprodukował "najlepszą próbę"? –
Ah tak. Dzięki. Naprawiłem przykład. Chociaż oczywiście chciałbym, żeby były spójne, albo styl będzie działał dla pożądanej wydajności jako t. Bardziej niepokoję się wcięciem i drukowaniem znaków nowej linii, niżbym się obawiał, gdyby używał równań lub dwukropków. – Krejko
Niestety, nie mam już kodu, który wyprodukował moją najlepszą próbę, ale składał się z zaledwie kilku różnych [myDescriptionString stringByReplacingOccurrencesOfString: @ "\\" withString: @ "\"], które usunęły wszystkie dodane znaki, które zostały dodane . Nie mogłem wymyślić, jak prawidłowo dodać z powrotem wcięcia. – Krejko