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 数据,以便可以通过解析 JSON 数据的普通 Foundation 类对其进行解析?

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。另一个事实是,要创建数据,您应该使用 dataWithJSONObject。并且此方法接受 NSDictionary 或 NSArray。NSString 不是此方法的有效类。

于 2013-03-27T20:14:32.470 回答
1

答案是创建正确格式的 JSON。如果您在手动创建 JSON 时格式不正确,那么您只会从序列化中获取一揽子“null”值。以下是让我发疯的事情,因为在@bgoers 提到其中一个之前,它们都是小因素。

  • 确保您包含正确的大括号 ([{}]) 并适当地关闭它们。这实际上不是一个小因素,但是如果您将数据基于文档(就像我一样),那么您可能会错过复制/粘贴其中一个花括号的机会。
  • 在复制/粘贴 JSON 数据的外观时,请确保使用的所有字符(尤其是“引号”标记)都是统一的。事实证明,我使用了花哨的开始和结束引号,它们被编码到文档中,而不仅仅是你在 xcode 中键入的 "。

一旦你有了有效的 JSON,Foundation 类应该可以正常工作。

于 2013-03-27T19:25:02.987 回答
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\"}";

注意:Dictionary可以是项目中的plist文件。

于 2013-03-27T19:47:24.823 回答
0

转到此链接以获取在线 JSON 到 NSDictionary/NSArray 转换器:

https://erkanyildiz.me/lab/jsonhardcode/

使用格式正确的 json 作为输入,然后将结果作为文字复制并粘贴到代码中NSDictionary *myDict = @{...};

于 2021-09-27T16:19:30.970 回答