来自postgres的JSON字符串未被识别为有效

时间:2014-09-15 15:45:33

标签: ios objective-c json

我在一个有效的JSON响应中有一个字符串(实际上是一个数组),如此

{
"rec": [
    {
        "updated_at": "",
        "user_id": 11,
       "ingredients": "[{ 'scale': 1.51111096, 'qty': 0.6666666, 'type': 'cup', 'essential': True},{ 'scale': 3.123, 'qty': 4.02, 'type': 'plate', 'essential': False}]"
    }
 ]
}

但我无法使用NSJSONSerialization JSONObjectWithData:data获取要处理的成分,因为该字符串不是有效的。有关如何处理这个的任何想法? Postgress上该字段的数据类型为text [],数组设置为true。

1 个答案:

答案 0 :(得分:1)

由于您没有提供任何代码,我决定使用您提供的JSON进行小型测试。

如果我正确理解了您的问题,您想要访问成分信息。由于成分以字符串形式出现,因此它们最初将被解析为NSString的一个实例。就像你说过你可以使用NSJSONSerialization类再次解析字符串,但问题是来自服务器的字符串是无效的JSON。

要使该JSON字符串有效,您需要用双引号(")替换单引号('),并且布尔值不应大写(" False"必须被" false")取代。

如果您无法更改服务器代码,唯一的方法就是做一些" hacks"在客户端。 这段代码只是一个如何完成的例子,你不应该像生产中的同步请求那样,而忽略错误。

    //I'm getting the JSON code that you provided in the question from a local test server.
NSData *jsonData = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"http://localhost:1337/test"]];
NSError *error;
id parsedJson = [NSJSONSerialization  JSONObjectWithData:jsonData options:kNilOptions error:&error];
//Please don't ignore the errors in production code

//The next lines will retrieve the ingredients string;
NSDictionary *oneRecord = [[parsedJson objectForKey:@"rec"] lastObject];
NSMutableString *ingredients = [[oneRecord objectForKey:@"ingredients"] mutableCopy];
NSRange stringRange= NSMakeRange(0, [ingredients length]);

//The next 3 lines of code will turn your bad formatted String into valid JSON sintax
[ingredients replaceOccurrencesOfString:@"False" withString:@"false"
options:kNilOptions range:stringRange];
[ingredients replaceOccurrencesOfString:@"True" withString:@"true"
options:kNilOptions range:stringRange];
[ingredients replaceOccurrencesOfString:@"'" withString:@"\""
options:kNilOptions range:stringRange];

//Then you can parse the ingredients string without any erros;
id parsedIngredients = [NSJSONSerialization JSONObjectWithData:[ingredients dataUsingEncoding:NSUTF8StringEncoding]
options:kNilOptions error:&error];

NSLog(@"%@",parsedIngredients);

在此之后,您可以在调试控制台中看到有效输出:

2014-09-15 18:12:51.491 Test[96459:60b] (
    {
    essential = 1;
    qty = "0.6666666";
    scale = "1.51111096";
    type = cup;
},
    {
    essential = 0;
    qty = "4.02";
    scale = "3.123";
    type = plate;
}
)

但就像我说这是非常" hacky"并且可能无法解决其他JSON响应中可能出现的其他格式问题。我建议你修复服务器中的响应并输出有效的JSON,可以直接在客户端解析,而不需要任何" hack"。