我在一个有效的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。
答案 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"。