JSON请求正文 - 目标c格式

时间:2017-02-08 20:51:27

标签: ios objective-c json elasticsearch

我有一个用obj-c编写的iOS应用程序,它将查询键入搜索框并在elasticsearch api上执行多匹配字段查询。有人可以帮助JSON请求体的格式化吗?这是我想要格式化的get查询主体的示例:

GET /test/data/_search
{
  "min_score": 1.6,<br/>
  "query": { <br/>
      "multi_match": {<br/>
             "query": "smith",<br/>
             "fields": ["name", "surname"]<br/>
      }<br/>
    },<br/>
  "_source": ["name", "surname", "address"]<br/>
}<br/>

在我的代码中,我有:

NSString *jsonRequest = [NSString stringWithFormat:@"{\"min_score\":\"1.6\",\"query\":{\"multi_match\":{\"name\",\"surname\":\"%@\"}},\"_source\":[\"name\",\"surname\",\"address\"]}",[self.searchTextField text]];

[self.searchTextField text] 是从搜索字段中获取的值。

但是当我查询时从ElasticSearch返回时出现此错误:

  

reason =“意外的字符(','(代码44)):期待冒号   在[来源:

中分隔字段名称和值\ n

就像测试一样,使用查询只匹配一个字段工作正常,所以它看起来只是一个格式化问题。

抱歉忘记添加这是我设置我使用JSON正文发布到的URL的地方:

[self postDataToUrl:@"http://localhost:9200/test/data/_search?pretty=true" withJson:jsonRequest];

然后转到:

-(void)postDataToUrl:(NSString*)urlString withJson:(NSString*)jsonString
{
    NSData* responseData = nil;
    NSURL *url=[NSURL URLWithString:[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];

    responseData = [NSMutableData data] ;
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithRequest:request
                completionHandler:^(NSData *data,
                                    NSURLResponse *response,
                                    NSError *error) {
                    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                    NSLog(@"the final output is:%@",responseString);
                    NSError *lerror = nil;
                    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0  error:&lerror];

                if (error != nil) {
                    NSLog(@"Error parsing JSON.");
                }
                else {

当我通过常规比赛体时,这一切都可以正常工作,例如:

NSString *jsonRequest = [NSString stringWithFormat:@"{\"min_score\":\"1.6\",\"query\":{\"match\":{\"name\":\"%@\"}},\"_source\":[\"name\",\"surname\",\"address\"]}",[self.searchTextField text]];

2 个答案:

答案 0 :(得分:0)

您可能需要查看搜索结果的内容。看起来你有一个回车\n,它在昏迷前打破了字符串。您可以像这样删除回车符:

NSString *newString = [[self.searchTextField text] stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSString *jsonRequest = [NSString stringWithFormat:@"{\"min_score\":\"1.6\",\"query\":{\"match\":{\"name\":\"%@\"}},\"_source\":[\"name\",\"surname\",\"address\"]}", newString];

答案 1 :(得分:0)

检查来自@cybergen的帖子,JSON主体没有正确设置,Elastic需要这种格式的JSON查询:

{
  "query": {
    "multi_match" : {
      "query":    "smith", 
      "fields": [ "name", "surname" ] 
    }
  }
}

我格式化了JSON请求字符串以匹配我的代码。