2013-03-27 7 views
9

Chcę skonfigurować statyczne dane pozorne w JSON, aby moja aplikacja była przetwarzana. To jest czysto po stronie klienta; Nie chcę niczego pobierać z sieci.Jak utworzyć obojętne dane JSON na kliencie w obiektywnym C/iOS?

Wszystkie pytania i odpowiedzi, które dotychczas widziałem, mają zmienne NSData * przechowujące dane pobrane z połączeń sieciowych i [JSONSerialization JSONObjectWithData: ...] zwykle działające na danych, które nie zostały utworzone ręcznie.

Oto przykład tego, co próbowałem w ramach xcode.

NSString* jsonData = @" \"things\": [{ \ 
\"id\": \"someIdentifier12345\", \ 
\"name\": \"Danny\" \ 
\"questions\": [ \ 
    { \ 
     \"id\": \"questionId1\", \ 
     \"name\": \"Creating dummy JSON data by hand.\" \ 
    }, \ 
    { \ 
     \"id\": \"questionId2\", \ 
     \"name\": \"Why no workie?\" 
    } \ 
    ], \ 
\"websiteWithCoolPeople\": \"http://stackoverflow.com\", \ 
}]}"; 

NSError *error; 
NSDictionary *parsedJsonData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

Próby takie jak to (i stara się zmienić ten stan rzeczy, jak przełączanie NSString * do NSData * z tego ciąg JSON) przyniosły NULL danych parsedJsonData lub wyjątki podczas próby utworzenia że JSON zmienna danych lub podczas próby przeanalizuj to.

Jak utworzyć fałszywe dane JSON w moim własnym kodzie tak, aby można je było analizować za pomocą normalnych klas Foundation, które analizują dane JSON?

+1

Nie wierzę, że JSON może zacząć od ciągu. Spróbuj dodać '{' na początek przed '" rzeczy "'. Następnie weź ciąg znaków i użyj metody '[jsonData dataUsingEncoding: NSUTF8StringEncoding]', ponieważ 'NSJSONSerialization' pobiera tylko dane, a nie ciąg znaków :) – bgoers

+0

Dzięki. Próbowałem już tej trasy wcześniej, ale wyszło na jaw, że mogłem źle sformułować JSON, dlatego nie mogę wydawać danych ręcznie. Chcesz napisać mały przykład tego, jak powinien wyglądać JSON, gdy próbuję nowego JSON? Jeśli to działa, oznaczę twoją odpowiedź jako odpowiedź, ponieważ ludzie próbujący to zrobić mogą bardzo źle wpłynąć na JSON jako na problem. – Danny

+1

Kiedy muszę to zrobić, mam plik tekstowy zawierający json w pakiecie aplikacji zamiast kodu NSString w kodzie. Myślę, że łatwiej jest zamienić na produkcyjne adresy URL i łatwiej też będzie je formatować. –

Odpowiedz

20

Zapisałbym mój test json jako oddzielne pliki w aplikacji. Zaletą tego jest to, że można skopiować tylko &, wklejając odpowiedzi z serwisu WWW i czytając je z łatwością bez konieczności konwertowania ich na NSDictionaries lub escaped strun.

Poprawnie sformatowałem twój JSON (używając jsonlint) i zapisałem go w pliku o nazwie testData.json w pakiecie aplikacji.

{"things": 
    [{ 
    "id": "someIdentifier12345", 
    "name": "Danny", 
    "questions": [ 
        { 
        "id": "questionId1", 
        "name": "Creating dummy JSON data by hand." 
        }, 
        { 
        "id": "questionId2", 
        "name": "Why no workie?" 
        } 
        ], 
    "websiteWithCoolPeople": "http://stackoverflow.com" 
    }] 
} 

Następnie, aby przeanalizować ten plik w aplikacji, wystarczy załadować plik z katalogu pakunków.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"testdata" ofType:@"json"]; 
NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath]; 

NSError *error = nil; 
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 

NSLog(@"%@", jsonDict); 

Byłoby już dość łatwo rozszerzyć to, aby załadować dowolną liczbę odpowiedzi i zasadniczo mieć lokalny serwis internetowy. Nie byłoby wtedy dużo pracy nad dostosowaniem tego, aby załadować odpowiedzi ze zdalnego serwera.

+0

Uwielbiam instrukcje dla pliku zewnętrznego. Świetna odpowiedź! – Danny

+0

@James P, jak mogę utworzyć plik JSON? –

+0

Po prostu umieść JSON w zwykłym pliku tekstowym i zmień jego rozszerzenie z .txt na .json –

1

Odpowiedź dotyczy tworzenia prawidłowo uformowanego JSON. Jeśli Twój JSON jest zniekształcony, gdy utworzysz go ręcznie, otrzymasz po prostu "zerową" wartość z serializacji. Oto rzeczy, które doprowadzały mnie do szaleństwa, ponieważ były małymi czynnikami, dopóki @bgorzy nie wspomnieli o jednym z nich.

  • Upewnij się, że zawierasz odpowiednie szelki ([{}]) i odpowiednio je zamykasz. To nie jest mały czynnik, ale jeśli opierasz swoje dane na dokumentacji (tak jak ja), możesz stracić możliwość kopiowania/wklejania jednego z nawiasów klamrowych.
  • Podczas kopiowania/wklejania danych, które powinny wyglądać w JSON, upewnij się, że wszystkie użyte znaki - szczególnie "cudzysłowy" - są jednolite. Okazało się, że używam fantazyjnych otwierających i zamykających cudzysłowów, które zostały zakodowane w dokumentacji, a nie tylko "wpiszesz do xcode."

Po uzyskaniu ważnego JSON, zajęcia Fundacji powinien działać dobrze

1
#import "SBJSON.h" 

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects: 
                     @"2013-03-27", 
                     @"2013-04-04", 
                     @"2013-03-27", 
                     @"0", 
                     @"1", 
                     @"1",nil] 
                  forKeys:[NSArray arrayWithObjects: 
                     @"startDate", 
                     @"endDate", 
                     @"selectedDate", 
                     @"shadowsOfID", 
                     @"appointmentsOfID", 
                     @"shadowType",nil]]; 


    SBJsonWriter *p = [[SBJsonWriter alloc] init]; 
     NSString *jsonStr = [NSString stringWithFormat:@"%@",[p stringWithObject:dictionary]]; 

jsonStr teraz zawiera następujące elementy:.

"{\"shadowType\":\"1\",\"startDate\":\"2013-03-27\",\"selectedDate\":\"2013-03-27\",\"endDate\":\"2013-04-04\",\"shadowsOfID\":\"0\",\"appointmentsOfID\":\"1\"}"; 

zauważyć, że:. Słownik może być plik plist w projekcie

4

Spróbuj czegoś takiego!

NSDictionary *jsonObject = @{@"id": @"someIdentifier", 
          @"name":@"Danny", 
          @"questions":@[ 
              @{@"id":@"questionId1", 
               @"name":@"Creating dummy JSON"}, 
              @{@"id":@"questionId2", 
               @"name":@"Creating dummy JSON"}, 
              @{@"id":@"questionId3", 
               @"name":@"Creating dummy JSON"}], 
          @"websiteCoolPeople":@"http://stackoverflow.com"}; 


NSLog(@" JSON = %@",jsonObject); // let's see if is correct 

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:nil]; 

NSLog(@" JSON DATA \n %@",[NSString stringWithCString:[jsonData bytes] encoding:NSUTF8StringEncoding]); 


//lets make a check 

if ([NSJSONSerialization isValidJSONObject:jsonObject] == YES) { 

    NSLog(@" ;) \n"); 
} 
else{ 

    NSLog(@"Epic Fail! \n"); 

} 


//Going back 

NSDictionary *parsedJSONObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; 


NSLog(@"Cool! : %@",parsedJSONObject); 
+0

Podoba mi się, że twoja odpowiedź wyraźnie stworzyła JSON ze słownikiem i że użyła danych związanych z moim pierwotnym pytaniem. W ten sposób przyszli wyszukujący będą mogli łatwo śledzić. – Danny

2

przede wszystkim

-(void)createJsonData 
{ 
    //your objects for json 
    NSArray * [email protected][@"object1",@"object2",@"object3",@"object4"]; 
    //your keys for json 
    NSArray * [email protected][@"key1",@"key2",@"key3",@"key4"]; 

    //create dictionary to convert json object 
    NSDictionary * jsonData=[[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys]; 


    //convert dictionary to json data 
    NSData * json =[NSJSONSerialization dataWithJSONObject:jsonData options:NSJSONWritingPrettyPrinted error:nil]; 


    //convert json data to string for showing if you create it truely 
    NSString * jsonString=[[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@",jsonString); 
} 

ten tworzy jsonData. innym faktem jest to, że aby utworzyć dane, powinieneś użyć dataWithJSONObject. a ta metoda akceptuje NSDictionary lub NSArray. NSString nie jest prawidłową klasą dla tej metody.

0

Aby załadować lokalny plik JSON w systemie iOS, należy przejść do fazy tworzenia, wybierając cel, załadować plik przy użyciu zasobów pakietu kopii. Następnie skompiluj plik. Po prostu dodanie go przez "plik-> nowy plik -> inny -> pusty" procedura nie będzie działać. (Próbowałem przez 4 godziny, aby uzyskać oczekiwany wynik.)

P.S. Nie mogę tego komentować, ponieważ jest mniej reputacji.