javascript - 使用 Objective-C 将 JSON 解析为 C 风格的字符数组

标签 javascript objective-c c json cordova

在为 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/

相关文章:

javascript - AngularJS 许多 Controller ng 设计 Material

objective-c - 在 SpriteKit 中循环背景音乐

objective-c - Apple 说 NSManagedObjectContext 归创建它的线程或队列所有时是什么意思?

iphone - 53 * .01 = .531250

c - 多个进程中的静态变量(信号)

c - 数组打印少一个数字

javascript - 如何处理浏览器尚未调用代码的 SJR 响应?

javascript - 从文本文件加载 Json 对象 - 返回未捕获的语法错误 : Unexpected token "[ "

javascript - 如何根据自定义属性分别为具有相同类的所有元素设置背景颜色

c - 错误 : ‘O_CREATE’ undeclared (first use in this function)