在为 cordova 开发插件时,我在解析包含 C 风格字符数组的 JSON 对象时遇到了一些问题。 JSON 对象如下所示:
{
UUID: "E6DACE68-5F93-4127-AD80-EE8C4AF4D539",
primary: true,
characteristics: [
{
properties:"CBCharacteristicPropertyRead",
value: [0x51,0xA2,0x5F,0xFF],
permissions:"CBAttributePermissionsReadable",
UUID: "54ADDF4D-771A-4029-81FF-20F36210D2F2"
},
{
properties:"CBCharacteristicPropertyRead",
value: [0xAA,0xBB,0xCC,0xDD],
permissions:"CBAttributePermissionsReadable",
UUID: "14A68648-2FC3-440D-AAA8-818FD73539A3"
}
]
}
我正在使用以下代码对此进行解析(请参阅下面的完整版本,出于演示目的,我删除了重要的部分):
NSMutableArray *characteristics = [[NSMutableArray alloc] init];
NSError *error = nil;
NSData *jsonService = [[command.arguments objectAtIndex:0] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *serviceArgs = (NSDictionary*)[NSJSONSerialization JSONObjectWithData:jsonService options:kNilOptions error:&error];
NSMutableDictionary * characteristicsDictionary = [NSMutableDictionary dictionaryWithCapacity:10];
for (NSDictionary *characteristicArgs in [serviceArgs valueForKey:@"characteristics"]) {
NSString *value = [characteristicArgs objectForKey:@"value"];
NSString *props = [characteristicArgs objectForKey:@"properties"];
NSString *permissions = [characteristicArgs objectForKey:@"permissions"];
NSString *uuid = [characteristicArgs objectForKey:@"UUID"];
//NSLog(@"Adding Characteristic: uuid=%@, properties=%@, value=\"%@\", permissions=%@", uuid, props, value,permissions);
NSData *dataValue;
if (value == (id)[NSNull null] || value.length == 0 ) {
//NSLog(@"value is null!");
dataValue = nil;
}
else
dataValue = [value dataUsingEncoding:NSUTF8StringEncoding];
//...
//...
如您所见,我之前使用的是 NSString,但我不得不更改它,因为数据转换无法跨浏览器正常工作。现在我想将 dataValue 行更改为:
dataValue = [NSData dataWithBytes:value length:sizeof(value)];
但我不确定如何解析数据。我不完全确定我需要什么样的数据类型。所以基本上我需要知道,我的 javascript 数组将被转换成什么数据类型(或者如何告诉 NSJSONSerialization 它应该解析成一个 char[]。真正重要的是要注意并不是所有的值都包含 UTF8 数据或任何其他类型常见的字符串数据。它只是普通的字节码(因此直接解析为 NSData 将是最好的选择)。
提前致谢。
最佳答案
value 是一个 NSArray,每个字符都是一个 NSNumber,所以你可以这样做(我已经简化了你的代码,你不需要所有的转换)
NSDictionary *serviceArgs = [command.arguments objectAtIndex:0];
for (NSDictionary *characteristicArgs in [serviceArgs valueForKey:@"characteristics"]) {
NSArray *values = [characteristicArgs objectForKey:@"value"];
NSString *props = [characteristicArgs objectForKey:@"properties"];
NSString *permissions = [characteristicArgs objectForKey:@"permissions"];
NSString *uuid = [characteristicArgs objectForKey:@"UUID"];
//NSLog(@"Adding Characteristic: uuid=%@, properties=%@, value=\"%@\", permissions=%@", uuid, props, values,permissions);
for (NSNumber *value in values) {
//here do domething with each char
}
}
关于javascript - 使用 Objective-C 将 JSON 解析为 C 风格的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29139936/