11

アプリが処理する静的ダミー データを JSON で設定したいと考えています。これは純粋にクライアント側です。ネットワークから何も取得したくありません。

これまでに見たすべての質問と回答には、ネットワーク呼び出しから取得したものを格納する NSData* 変数と、[JSONSerialization JSONObjectWithData: ...] 通常、手動で作成されたのではないデータに作用するものがあります。

これは、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];

そのような試み (そして、その JSON 文字列から NSString* を NSData* に切り替えるなど、物事を変更しようとする試み) は、その JSON データ変数を作成しようとしたとき、またはそれを解析しようとしたときに、null parsedJsonData データまたは例外をもたらしました。

JSON データを解析する通常の Foundation クラスで解析できるように、自分のコード内にダミーの JSON データを作成するにはどうすればよいですか?

4

6 に答える 6

23

テスト json をアプリ内の個別のファイルとして保存します。これの利点は、Web サービスから応答をコピーして貼り付けるだけで、応答を NSDictionaries やエスケープ文字列に変換することなく簡単に読み取ることができることです。

JSON を ( jsonlinttestData.jsonを使用して) 正しくフォーマットし、アプリ バンドルで指定されたファイルに保存しました。

{"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" 
     }]
}

次に、アプリでこのファイルを解析するには、バンドル ディレクトリからファイルをロードするだけです。

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);

これを拡張して、任意の数の応答をロードし、本質的にローカル Web サービスを持つようにすることは非常に簡単です。これをリモートサーバーからの応答をロードするように適応させるのは、それほど面倒なことではありません。

于 2013-03-27T20:43:14.017 に答える
4

このようなものを試してみてください!!

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);
于 2013-03-27T20:04:30.963 に答える
2

初めに

-(void)createJsonData
{
    //your objects for json
    NSArray * objects=@[@"object1",@"object2",@"object3",@"object4"];
    //your keys for json
    NSArray * keys=@[@"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);
}

これにより、jsonData が作成されます。もう 1 つの事実は、データを作成するには、dataWithJSONObject を使用する必要があるということです。このメソッドは NSDictionary または NSArray を受け入れます。NSString は、このメソッドの有効なクラスではありません。

于 2013-03-27T20:14:32.470 に答える
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 には次のものが含まれるようになりました。

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

次の点に注意してください。ディクショナリは、プロジェクト内の plist ファイルにすることができます。

于 2013-03-27T19:47:24.823 に答える
1

その答えは、正しい形式の JSON を作成することにあります。手動で作成したときに JSON の形式が正しくない場合は、シリアライゼーションからブランケットの "null" 値を取得するだけです。@bgoersがそのうちの1つを言及するまで、それらは小さな要因だったので、私を夢中にさせたものは次のとおりです。

  • 正しい中かっこ ([{}]) を含め、適切に閉じていることを確認してください。これは実際には小さな要因ではありませんが、(私がそうであったように) ドキュメントに基づいてデータを作成している場合、中括弧の 1 つをコピー/貼り付けするのを見逃す可能性があります。
  • JSON データがどのように見えるかをコピーして貼り付ける場合は、使用されるすべての文字 (特に「引用符」) が統一されていることを確認してください。xcode.

有効な JSON を取得したら、Foundation クラスは問題なく動作するはずです。

于 2013-03-27T19:25:02.987 に答える