2012-08-27 16 views
13

jestem nowicjuszem w iOS dev i próbuję analizować lokalny plik JSON, takich jakCocoa Touch - Jak parse lokalny plik Json

{"quizz":[{"id":"1","Q1":"When Mickey was born","R1":"1920","R2":"1965","R3":"1923","R4","1234","response","1920"},{"id":"1","Q1":"When start the cold war","R1":"1920","R2":"1965","R3":"1923","rep4","1234","reponse","1920"}]}

tutaj jest mój kod:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"]; 
NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
// Parse the string into JSON 
NSDictionary *json = [myJSON JSONValue]; 

// Get all object 
NSArray *items = [json valueForKeyPath:@"quizz"]; 

NSEnumerator *enumerator = [items objectEnumerator]; 
NSDictionary* item; 
while (item = (NSDictionary*)[enumerator nextObject]) { 
    NSLog(@"clientId = %@", [item objectForKey:@"id"]); 
    NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); 
    NSLog(@"job = %@",  [item objectForKey:@"Q2"]); 
} 

znalazłem na tej stronie próbki, ale pojawia się następujący błąd

-JSONValue powiodło się. Błąd: "Klucz wartości" nie jest oczekiwany po kluczu obiektu.

+0

Twój JSON nieważny. –

Odpowiedz

14

JSON ma ścisły klucz/notację wartości, pary klucz/wartość dla R4 i odpowiedzi nie są poprawne. Spróbuj tego:

NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}]}"; 

Jeśli czytasz ten ciąg z pliku, nie trzeba wszystkie ukośniki
Plik byłoby coś takiego:

{ „quiz”: [{"id": "1", "Q1": "Gdy Mickey był urodzony", "R1": "1920", "R2": "1965", "R3": "1923", "R4": "1234", "odpowiedź": "1920"}, {"id": "1", "Q1": "Gdy rozpocznie zimną wojnę", "R1": "1920", "R2": "1965 "," R3 ":" 1923 "," R4 ":" 1234 "," reponse ":" 1920 "}]}


testowałem z tym kodem:

NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}, {\"id\":\"1\",\"Q1\":\"When start the cold war\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"reponse\":\"1920\"}]}"; 
NSLog(@"%@", jsonString); 
NSError *error = nil; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; 

NSArray *items = [json valueForKeyPath:@"quizz"]; 

NSEnumerator *enumerator = [items objectEnumerator]; 
NSDictionary* item; 
while (item = (NSDictionary*)[enumerator nextObject]) { 
    NSLog(@"clientId = %@", [item objectForKey:@"id"]); 
    NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); 
    NSLog(@"job = %@",  [item objectForKey:@"Q2"]); 
} 

Mam wrażenie, że skopiowano starego kodu, ponieważ nie używasz serializacji Apple i Enumerator zamiast Fast Enumeration. Cały wyliczenie rzeczy można napisać proste

NSArray *items = [json valueForKeyPath:@"quizz"]; 
for (NSDictionary *item in items) { 
    NSLog(@"clientId = %@", [item objectForKey:@"id"]); 
    NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); 
    NSLog(@"job = %@",  [item objectForKey:@"Q2"]); 
} 

lub nawet hodowcy z block based enumeration, hwere trzeba dodatkowo indeks jeśli potrzebne do szybkiego i bezpiecznego wyliczenie.

NSArray *items = [json valueForKeyPath:@"quizz"]; 
[items enumerateObjectsUsingBlock:^(NSDictionary *item , NSUInteger idx, BOOL *stop) { 
    NSLog(@"clientId = %@", [item objectForKey:@"id"]); 
    NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); 
    NSLog(@"job = %@",  [item objectForKey:@"Q2"]); 
}]; 
+0

dziękuję bardzo za pomoc. Jeszcze jedno pytanie: w jaki sposób mogę pobrać indeks konkretnych obiektów w tablicy i przeglądać wartość klucza?Mam na myśli, jeśli chcę wybrać drugi obiekt bezpośrednio i wyświetlić wartość id? – Skunkies

+0

po przeanalizowaniu łańcucha JSON będziesz miał nsarrays i słowniki. więc dla tablicy możesz wykonać 'item = [items objectAtIndex: 1]', aby uzyskać drugi element. Ale to już nie ma nic wspólnego z jsonem. to jest standardowa zawartość tablicy/słownika. – vikingosegundo

0

Wygląda na to, że w pliku json występuje literówka.

Wymień
"R4","1234","response","1920" z "R4":"1234","response":"1920"
i
"rep4","1234","reponse","1920" z "rep4":"1234","response":"1920"

2

użytkowania jsonlint.com znaleźć błędy w ciąg JSON.
W tym przypadku, to mówi masz nieważnej JSON blisko "R4"

4
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"fileName" ofType:@"json"]; 
NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
NSError *error = nil; 
NSArray *jsonDataArray = [NSJSONSerialization JSONObjectWithData:[myJSON dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; 
0

Swift 2.3 używam metody narzędzie do konwersji plików JSON do słownika:

func getDictionaryFromJSON(jsonFileName: String) -> [String: AnyObject]? { 
    guard let filepath = NSBundle.mainBundle().pathForResource(jsonFileName, ofType: "json") else { 
     return nil 
    } 

    guard let data = NSData(contentsOfFile: filepath) else { 
     return nil 
    } 

    do { 
     let dict = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject] 
     return dict 
    } catch { 
     print(error) 
     return nil 
    } 
} 
Powiązane problemy