WebHU - Programozási kérdések és válaszok

A JSON formátumú NSString NSArray formátumú konvertálása sikertelen

Elnézést, hogy még egy kérdést teszek fel az NSArray-re való konvertálásról, de ezt még azután sem tudom működésre bírni, hogy több tucat bejegyzést elolvastam ugyanabban a témában. Nagyon egyszerűnek tűnik, de...

- (void) parseList : (NSString *) str {

    NSLog(@"list as a string: %@", str);

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

    if (!data) NSLog(@"no data");

    NSError *err = nil;
    NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];

    NSLog(@"count: %lu", (unsigned long)[arr count]);
}

Ez a kimenet:

lista karakterláncként: [{"id":"1","name":"példanév","fájlnév":"image.png"}]
szám: 0

Hogyan lehet a tömbszám 0? Egyértelműen egy elem van a tömbben.

Nem akarom feleslegesen bonyolítani ezt a bejegyzést, de ez fontos lehet, szóval íme. Az ebbe a függvénybe átadott karakterláncot a szerver titkosított formátumban adja vissza. Tehát mielőtt ide kerülne, először egy visszafejtési folyamaton megy keresztül, amely így néz ki:

- (NSString *) decryptBase64EncodedString : (NSString *) base64EncodedCipherTextString
                    base64EncodedIvString : (NSString *) base64IvString
{

    NSData *cipherData = [[NSData alloc] initWithBase64EncodedString:base64EncodedCipherTextString options:0];
    NSData *ivData = [[NSData alloc] initWithBase64EncodedString:base64IvString options:0];

    NSData *data = [self AES128Operation : kCCDecrypt
                          cipherTextData : cipherData
                                  ivData : ivData];

    NSString *decrypted = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    return decrypted;
}

Nem hiszem, hogy ennek a függvénynek a belseje annyira számítana, kivéve talán az utolsó két sort, amelyek rámutatnak arra, hogy ez a karakterlánc hogyan jön létre (az NSData-ból). Lehet, hogy se itt, se ott, de a fő konverzió az NSArray-re olyan egyszerűnek tűnik, hogy itt valami többnek kell történnie. (ha nem egyértelmű, a 'decrypted' karakterlánc az, ami a 'parseList'-be kerül)


  • Az Ön által közzétett első kódblokkban a arr értéke nil. Ebben az esetben naplózza a err címet, hogy lássa, mi a probléma. 13.04.2015
  • Igazad van. Nem hiszem el, hogy ezt nem vettem észre. A hiba a következő: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.). Valahogyan vannak benne nem nyomtatható karakterek. Most hogyan lehet azonosítani és eltávolítani őket... 13.04.2015
  • Bocs, agyfarkas. A tömbök szögletes zárójeleket használnak a JSON-ban. Nem fontos. 13.04.2015
  • NSLog(@"data: %@", data);, előfordulhat, hogy vannak olyan bájtok, amelyek nem jelennek meg a str fájlban. A AES128Operation részletei fontosak lehetnek, hogyan történik a párnázás, a kulcs és iv a megfelelő hosszúság stb. 13.04.2015

Válaszok:


1

Na, ezt én találtam ki. @rmmaddy teljes elismerésével rájöttem, hogy a tömböm nulla. Amikor hozzáadtam egy NSLog utasítást a hiba vizsgálatához, ezt találtam:

Error Domain=NSCocoaErrorDomain Code=3840 "A műveletet nem sikerült befejezni. (3840-es kakaóhiba.)" (Szemét a végén.)

Felfedeztem, hogy legalább egy nulla lezáró karakter van a JSON-karakterláncban, amelyet el kell távolítani, mielőtt megpróbáltam volna elemezni. Ezt a sort adtam hozzá:

str = [str stringByReplacingOccurrencesOfString:@"\0" withString:@""];

módszerem elejére. Kicsit durva, de mit tehetsz?

A teljesség kedvéért itt van a teljes módszer, amely sikeresen elemzi a JSON-karakterláncot:

- (void) parseList : (NSString *) str {
    str = [str stringByReplacingOccurrencesOfString:@"\0" withString:@""];

    NSLog(@"list as a string: %@", str);

    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

    if (!data) NSLog(@"no data");

    NSError *err = nil;
    NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err];

    if (!arr) NSLog("%@", err);

    NSLog(@"count: %lu", (unsigned long)[arr count]);
}

A kimenetem változatlan marad, kivéve, hogy a tömbök száma most 1, ahogy annak lennie kell, és most folytathatom a JSON tömb különféle elemeinek elemzését. Remélem ez segít valakinek.

13.04.2015
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..