2014-07-07 14 views
7

jestem generowania tekstu json i podczas generowania tablicę dostaję wiele ukośniki nie muszę:Usuń odwrotny ukośnik („”) w Objective-C

[\n  
    {\n    
     \"Speed\" : 2,\n    
     \"Direction\" : 3,\n    
     \"OdometerDelta\" : 4,\n    
     \"Longitude\" : 0,\n    
     \"Latitude\" : 1,\n    
     \"TimeStamp\" : \"1996-06-17\"\n  
    },\n  
    {\n    
     \"Speed\" : 2,\n    
     \"Direction\" : 3,\n    
     \"OdometerDelta\" : 4,\n    
     \"Longitude\" : 0,\n    
     \"Latitude\" : 1,\n    
     \"TimeStamp\" : \"1996-06-17\"\n  },\n  
    {\n    
     \"Speed\" : 2,\n    
     \"Direction\" : 3,\n    
     \"OdometerDelta\" : 4,\n    
     \"Longitude\" : 0,\n    
     \"Latitude\" : 1,\n    
     \"TimeStamp\" : \"1996-06-17\"\n  
    }\n 

] 

ten sposób mogę uzyskać wygenerowany json NSString tekst:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

Oto część, gdzie robi się ciekawie, jeśli mogę użyć

jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 

wszystkie "\ n" jest usuwany (backsla sh jest również usuwany), ale jeśli używam

jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\" withString:@""]; 

wszystkie ukośniki odwrotne nadal tam są. Jestem całkiem nowy w kwestii obiektywizmu-c, więc nie mogę nawet pomyśleć o możliwym sposobie, dlaczego tak się dzieje, próbowałem na kilka sposobów, i żaden z nich nie działał. Mój strzał w ciemno jest taki, że problem jest spowodowany kodowaniem, ale mogę się mylić.

Oto jak produkować mój plik json:

for(int i = 0; i < 3; i++) 
    { 

     NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithDouble:0.0], @"Longitude", 
             [NSNumber numberWithDouble:1.0], @"Latitude", 
             @"1996-06-17", @"TimeStamp", 
             [NSNumber numberWithDouble:2.0], @"Speed", 
             [NSNumber numberWithDouble:3.0], @"Direction", 
             [NSNumber numberWithDouble:4.0], @"OdometerDelta", 
             nil]; 


     [arr addObject:jsonDictionary]; 
    } 


    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error]; 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

Z góry dzięki.

+2

Ważne jest, aby wiedzieć, co spowodowało wydruk wyjściowy JSON. Na przykład może to być coś, co dodaje dla ciebie ucieczkę, aby nowe linie były widoczne. Więc proszę podać, w jaki sposób otrzymałeś dane wyjściowe. – trojanfoe

+2

Twoim problemem jest to, że najwyraźniej "serializowałeś" JSON dwukrotnie. Napraw to, zamiast próbować un-muddle rzeczy po czyn. –

+0

@trojanfoe Właśnie dodałem kod, jak produkuję mój JSON. – MisterMortal

Odpowiedz

10

Ta linia

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error]; 

Daje ci ciąg JSON z liniami, spacjami i wcięciami, aby go ładnie sformatować, gdy na niego spojrzysz.umieszcza dodatkowe dane liniowe w danych. Jeśli to zrobisz:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:0 error:&error]; 

Łańcuch JSON nie będzie zawierał żadnych dodatkowych znaków formatujących i będzie wyglądał na jedną bardzo długą linię.

Twoje opublikowane wyniki wyglądają jak dane wyjściowe debugowania, a znaki \n i \" są opatrywane przez opis debugowania. W faktycznym łańcuchu są to właściwe znaki (znaki 10) i znaki podwójnego cudzysłowu. To dlatego twoja pierwsza instrukcja zastąpienia działa, ponieważ @"\n" jest ciągiem znaków jednolicie zawierającym tylko znak 10 w nim. W twoim drugim oświadczeniu @"\\" jest ciągiem znaków z odwróconym ukośnikiem i nie ma rzeczywistych odwrotnych ukośników w ciągu JSON.

+0

Prawdopodobnie miałeś na myśli "nie umieszczasz dodatkowych * ukośników * ..." –

+0

@MartinR Przez "dane" miałem na myśli w łańcuchach i liczbach JSON. Wszystkie elementy w przykładzie w pytaniu są tylko formatowaniem i nie mają znaczenia dla semantyki reprezentowanych danych. – JeremyP

0
sonString = [jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 

nie usunie \ n usunie znaki nowego wiersza, co rodzi pytanie, jak ty dostaniem wyjście zostaną wyświetlone, że to, co naprawdę jest w struny czy też jest to tylko informacja generowana na wyjściu, aby pokazać, co to znak nowego wiersza i cytat zamiast końca ciągu.

także usunąć \”z ciągiem naprawdę powinieneś tego robić

jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\\"" withString:@"\""]; 

przeciwnym razie ryzykujemy usunięcie \ znaki, które są przypuszczać, aby tam być.

+1

Myślę, że wykonywanie tej linii jest nieprawidłowe; lepsze jest podejście podjęte przez @HotLicks w komentarzach, gdzie zapobieganie ucieczce w pierwszej kolejności jest lepsze niż usunięcie ich później. – trojanfoe

+0

Usuwanie \ n nie jest tutaj problemem. Mój problem polega na tym, że "stringByReplacingOccurrencesOfString" nie działa w moim przypadku, próbowałem tego, co właśnie zasugerowałeś i nie zadziałało. – MisterMortal

+0

@MisterMortal - Zastąpienie ciągów zawierających '\\' z stringByReplacingOccurrencesOfString jest bardzo trudne. Można to zrobić, ale wymaga starannego rozważenia scenariusza. –

Powiązane problemy