带有JSON的NSURL返回null

时间:2016-10-10 07:51:45

标签: ios objective-c json

当我尝试构建我的NSURL以打开另一个应用时,我一直收到(null)错误。

网址应为

ms-test-app://eventSourceId=evtSrcId&eventID=13675016&eventType=0&json={"meterresults":[{"clean":"2","raw":"2","status":"0"}]}

但是当我尝试构建我的网址时,它始终为空。

起初我认为它与URL本身有关,但它与我从示例here得到的相同。

另一个想法是,IOS在JSON中的双引号出现了一些问题,但我用%22替换了它们,但这也没有用。

以下是我构建网址的代码:

NSString *jsonString = [NSString stringWithFormat:@"{%22meterresults%22:[{%22clean%22:%22%@%22,%22raw%22:%22%@%22,%22status%22:%22%@%22}]}", cleanReadingString, rawReadingString, status];

NSLog(@"JSON= %@",jsonString);

//Send the result JSON back to the movilizer app
NSString *eventSourceId = @"evtSrcId";
NSString *encodedQueryString = [NSString stringWithFormat:@"?eventSourceId=%@&eventID=%d&eventType=0&json=%@",
                                eventSourceId, _eventId, jsonString];[NSCharacterSet URLQueryAllowedCharacterSet]]
NSString *urlStr = [NSString stringWithFormat:@"%@%@",
                    [_endpointUrls objectForKey:[NSNumber numberWithInt:(int)_selectedEndpoint]],
                    encodedQueryString];
NSURL *url = [NSURL URLWithString:urlStr];

我不知道自己错在哪里,如果有人有任何想法,我会很高兴。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您应该使用NSURLComponents来创建URL,而不是尝试将它们格式化为字符串。

  NSDictionary* jsonDict = @{@"clean": @"2", @"raw": @"2", @"status": @"0"};
  NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:NULL];
  NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  NSURLComponents* components = [[NSURLComponents alloc] init];
  components.scheme = @"ms-test-app";
  components.queryItems = @[
                        [[NSURLQueryItem alloc] initWithName:@"eventSourceId" value:eventSourceId],
                        [[NSURLQueryItem alloc] initWithName:@"eventID" value:@(_eventId).stringValue],
                        [[NSURLQueryItem alloc] initWithName:@"json" value:jsonString]
                        ];
  NSURL* url = components.URL;

一旦你以这种方式构建了URL,很明显你的字符串没有主机部分(或者更准确地说,你的一个参数被用作主机部分)。

关于无法将JSON作为URL参数发送的其他注释不正确。只要解析查询字符串的另一端的系统可以处理它,您就可以发送任何您想要的URL参数。