使用带有数组的 NSDictionary 创建 JSON 文件

Posted

技术标签:

【中文标题】使用带有数组的 NSDictionary 创建 JSON 文件【英文标题】:Creating JSON file using NSDictionary with an array 【发布时间】:2013-02-02 16:52:57 【问题描述】:

我正在尝试创建 json 数据以通过 HTTP POST 请求发送到服务器。 server 只会接受特定格式的 JSON,否则会返回错误。我可以成功创建 JSON 文件并将其上传到服务器,但是我收到以下错误,因为我没有错误地格式化我的 JSON:

JSON Error Message: 
    code = "-2";
    message = "Validation error: \"message\":\"to\":[\"Please enter an array\"]";
    name = ValidationError;
    status = error;

如您所见,服务器需要具有值和键数组的复杂 JSON 格式,但我不知道该怎么做。以下是我当前创建 JSON 数据的代码:

//Create Array With TO Values
NSDictionary *toField = @@"email" : emailField.text;
//Create Dictionary Values                
NSDictionary *messageContent = @@"subject" : @"APPNAME Registration Complete", @"from_email" : @"email@domain.com", @"to" : toField;
NSDictionary *mandrillValues = @@"key" : @"APPKEY",
                                 @"redirect_url" : @"PRIVATE-URL",
                                 @"template_name" : @"app-registration",
                                 @"template_content" : [NSNull null],
                                 @"message" : messageContent
                                ;

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

根据服务器,我需要一个包含键和值的数组,类似于nsdictionary。 但是,当我使用 NSArray 时,我无法添加值/键。关于我应该如何执行此操作的任何想法?以下是服务器将接受的example of the JSON format,我是否按照这种格式做所有正确的事情?如果不是,我需要更改什么以匹配格式?


"key": "example key",
"template_name": "example template_name",
"template_content": [
    
        "name": "example name",
        "content": "example content"
    
],
"message": 
    "text": "example text",
    "subject": "example subject",
    "from_email": "message.from_email@example.com",
    "from_name": "example from_name",
    "to": [
        
            "email": "example email",
            "name": "example name"
        
    ],

【问题讨论】:

像算法一样思考。你从头开始:你得到了什么? 表示封闭部分是字典,[ 表示封闭部分是数组。像这样思考并以类似的方式创建您的 JSON。所以一个 JSON 字典也将是一个 NSDictionary。 JSON 数组也将是 NSArray。解决这个问题的一个好方法是序列化您获得的示例并查看使用了哪些数据结构。祝你好运! :) 在发送之前序列化原始 JSON 是个好主意,谢谢! 【参考方案1】:

看起来“to”字段需要一个数组。除非变量 toField 是一个 NSArray,其中包含具有所描述的键和值的字典,否则您将获得一个与您想要的不完全一样的 JSON。

我建议输出传出 JSON 的描述,以准确查看存在差异的地方。

更新 我看到了您的问题的补充 -

NSDictionary *toField = @@"email" : emailField.text;

不创建数组。试试:

NSArray *toField = @[@@"email" : emailField.text];

【讨论】:

太棒了!我没想过将 NSDictionaries 放在 NSArrays 中。这可能吗?

以上是关于使用带有数组的 NSDictionary 创建 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

带有数组的 nsdictionary nspredicate 过滤

使用 NSDictionary 元素缓慢创建 NSMutableArray

使用具有多个值的键创建 NSDictionary

如何从 NSDictionary 中删除对象

如何创建具有多个键的 NSDictionary?

获取按其各自值排序的 NSDictionary 键