目标 C:从字典错误中创建一个 json 对象。字典值只能是字符串

Posted

技术标签:

【中文标题】目标 C:从字典错误中创建一个 json 对象。字典值只能是字符串【英文标题】:Objective C: Making a json object from dictionary error. Dictionary values can only be strings 【发布时间】:2014-06-12 11:21:37 【问题描述】:

我需要得到一个 Json 格式


   "_requestName":"login",
   "_ParamNames":[
      "userId",
      "password"
   ],
   "userId":"GFM",
   "password":"a"

所以我在做:

NSString *username=self.unTextField.text;
NSString *password=self.pwdTextField.text;
NSArray *params=[NSArray arrayWithObjects:@"userId",@"password", nil];
NSDictionary *dictionary=[NSDictionary dictionaryWithObjectsAndKeys:
                   @"_requestName", @"login",
                   @"_ParamNames", params,
                   @"userId", username,
                   @"password", password,
                   nil];
if (![NSJSONSerialization isValidJSONObject:dictionary]) 
    [self.validationTextField setText:@"Cannot make valid JSON"];

我收到一个错误,因为我试图将 NSArray params 作为值存储在 dictionary 中。文本字段确实显示“无法生成有效的 JSON”。我该如何解决? Json 必须以相同的格式发送。

【问题讨论】:

这不是你收到错误的原因——JSON 结构中的 NSArrays 很好。键名中的前导 _ 可能存在限制(检查 json.org 上的语法),或者您的变量“字符串”之一可能有一个非字符串。 他的变量看起来是从文本字段的text 属性中获取的,这使得它们只能作为字符串或nil,后者会在if 语句之前崩溃。 使用 error 参数运行 dataWithJsonObject 以获得准确的错误消息。 @Kartik_Koro 您是否尝试定义 error 参数? (而且你应该始终使用错误参数,如果翻译失败,请记录它。真正的人检查错误。) 【参考方案1】:

问题是你得到了相反的键/对象(首先是对象然后是方法中的键)。更好的解决方案是只使用一些文字。像这样的:

NSString *username= @"u";
NSString *password= @"p";

NSDictionary *dictionary = @
    @"_requestName": @"login",
    @"_ParamNames": @[
        @"userId",
        @"password"
    ],
    @"userId": username,
    @"password": password
;

if (![NSJSONSerialization isValidJSONObject:dictionary]) 
    NSLog(@"Cannot make valid JSON");
 else 
    NSLog(@"Hooray!");

【讨论】:

啊,是的,我错过了那个!我很少使用 objectsAndKeys 形式,所以并不明显。 如果您使用相同的方法创建字典,这个答案可能会稍微好一些。令人困惑的是,您说键/值顺序错误,然后显示具有不同顺序的代码 sn-p,尽管创建字典的方法不同。 非常感谢!效果很好。我想为该方法输入 value:key 而不是 key:value 有点令人困惑, key:value 通常是标准的,对吗?您定义字典的方式更简单,更容易定义。我会记住的。【参考方案2】:

试试这个工作正常.. 并得到 JSON 字符串的输出

 NSString *username=self.unTextField.text;
NSString *password=self.pwdTextField.text;
NSArray *params=[NSArray arrayWithObjects:@"userId",@"password", nil];
NSDictionary *dictionary=[NSDictionary dictionaryWithObjectsAndKeys:
                          @"login", @"_requestName",
                          params,@"_ParamNames",
                         username, @"userId",
                          password, @"password",
                          nil];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil];
NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];

NSLog(@"printing data %@",JSONString);

【讨论】:

好的,我错过了你先创建数组。

以上是关于目标 C:从字典错误中创建一个 json 对象。字典值只能是字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 NSDictionary 在 TableView 中创建部分

js从字典里取到一个字,用啥算法最快

如何从一系列字典中创建键和值的数据框[重复]

在火花中创建一个以字长为键、以排序字为值的字典?

使用 Counter 对象从两个列表中创建字典

快速从字典数组中创建字符串数组