目标 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 对象。字典值只能是字符串的主要内容,如果未能解决你的问题,请参考以下文章