【问题标题】:Sending string as JSON object将字符串作为 JSON 对象发送
【发布时间】:2012-04-20 10:02:32
【问题描述】:

我有一个任务,要求我将一个字符串作为 json 对象,在发送对象之前,我必须将此 json 对象放入 http 标头中。这是我的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *nid = @"";
    NSString *vocab = @"";
    NSString *inturl = @"testoverview";
    NSString *mail = @"chh@fbr.dk";
    NSString *md5pw = @"4d57e7ef1b7c3f431aca424764e9d786";

    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                    nid, @"nid", 
                                    vocab, @"vocab",
                                    inturl, @"inturl",
                                    mail, @"mail",
                                    md5pw, @"md5pw",nil];


    NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";


    NSError *error;



    NSString *url = @"http://udv.taenk.dk/chh/drupal-taenk/services/mobile";


    NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error];


    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLCacheStorageAllowed timeoutInterval:30.0];

     NSURLConnection *connction = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    FSRemoteExecutor *remote = [[FSRemoteExecutor alloc] init];
    [remote execute:url andHandler:[FSProductTestHandler alloc] JSONString:jsonString JSONData:jsonData Connection:connction];
    [remote connection:connction didReceiveData:jsonData];
    [remote connectionFinishedLoading:connction];

我的问题是我不能将 jsonDictionary 与对象一起使用并发送它,因为服务必须接收的字符串格式是这样的:

"{"nid":"","vocab":"", "inturl":"testoverview", "mail":"", "md5pw":""}"

字典会在字符串中插入 =,这不会给我服务的响应。

我想发送一个字符串(代码中的json)作为dataWithJSONObject:jso,喜欢这样:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:&error];

但我收到一个错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* +[NSJSONSerialization dataWithJSONObject:options:error:]:JSON 写入中的顶级类型无效”

谁能帮我解决这个问题?

【问题讨论】:

    标签: iphone objective-c ios5


    【解决方案1】:

    但是为什么要使用NSJSONSerialization呢? 您制作了自己的 JSON 字符串 (NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";)。然后你不需要再次运行NSJSONSerialization

    只需从您的*json (NSString) 中创建一个 NSData,然后将其发送到服务器。

    让你的 NSData 像这样:

    NSData *jsonPayload = [json dataUsingEncoding:NSUTF8StringEncoding];
    

    【讨论】:

    • 谢谢,您能告诉我如何获取服务响应数据并打印出来吗?
    【解决方案2】:

    首先,您的字符串json 不包含您认为的引号字符。您必须使用反斜杠“转义”字符串中的引号,以免终止字符串。您的线路:

    NSString *json = @"{nid:"",vocab:"",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";
    

    被解析如下:

    NSString *json = @"{nid:"
                     ",vocab:"
                     ",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";
    

    也就是说,它是按顺序引用的三个字符串。编译器连接相邻的字符串文字。所以,效果是这样的:

    NSString *json = @"{nid:,vocab:,inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";
    

    没有嵌入的引号字符。

    你想写的是:

    NSString *json = @"{nid:\"\",vocab:\"\",inturl:testoverview, mail:chh@fbr.dk, md5pw:4d57e7ef1b7c3f431aca424764e9d786}";
    

    你能显示以下输出吗:

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error];
    

    我看不出你会在哪里得到一个“=”字符。


    更新:

    此代码(根据您的问题修改):

    NSString *nid = @"";
    NSString *vocab = @"";
    NSString *inturl = @"testoverview";
    NSString *mail = @"chh@fbr.dk";
    NSString *md5pw = @"4d57e7ef1b7c3f431aca424764e9d786";
    
    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                    nid, @"nid", 
                                    vocab, @"vocab",
                                    inturl, @"inturl",
                                    mail, @"mail",
                                    md5pw, @"md5pw",nil];
    
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:NSJSONWritingPrettyPrinted error:&error];
    NSString *resultAsString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"jsonData as string:\n%@", resultAsString);
    

    给出这个输出:

    jsonData as string:
    {
      "md5pw" : "4d57e7ef1b7c3f431aca424764e9d786",
      "nid" : "",
      "inturl" : "testoverview",
      "mail" : "chh@fbr.dk",
      "vocab" : ""
    }
    

    如果您使用0 而不是NSJSONWritingPrettyPrinted,它会给出:

    jsonData as string:
    {"md5pw":"4d57e7ef1b7c3f431aca424764e9d786","nid":"","inturl":"testoverview","mail":"chh@fbr.dk","vocab":""}
    

    【讨论】:

    • 当我打印 jsonDictionary 的内容时,它会打印对象和键,它们之间有一个“=”。不是 jsonData 的内容中包含“=”。
    • 所以?你在乎NSDictionary 如何打印自己?这不会对您(应该)关心的任何事情产生任何影响。
    • 字符串必须以这种方式格式化,除非像我写的那样格式化,否则服务不会接受它。
    • 对。因此,您使用 JSON API(如 NSJSONSerialization)从字典中构建 JSON 字符串。你不需要向字典询问它的描述或关心它是如何记录自己的。
    • 我怎么知道 json 字符串的格式是否正确,其中包含 {} 和 : ?
    猜你喜欢
    • 2018-06-27
    • 2020-10-18
    • 2020-04-16
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2020-08-12
    相关资源
    最近更新 更多