使用 JSONKit 解析 JSON 文件

Posted

技术标签:

【中文标题】使用 JSONKit 解析 JSON 文件【英文标题】:Parsing JSON file using JSONKit 【发布时间】:2011-07-12 11:40:05 【问题描述】:

我正在构建一个音叉应用程序。前叉最多允许 12 个预设音高。

此外,我希望允许用户选择一个主题。每个主题都会加载一组预设(不必全部使用)。

我的配置文件看起来像这样*:


theme: "A3"
comment: "An octave below concert pitch (ie A4 440Hz)"
presets: 
    A3 220Hz=220.0


// http://en.wikipedia.org/wiki/Guitar_tuning
theme: "Guitar Standard Tuning"
comment:"EADGBE using 12-TET tuning"
presets: 
    E2=82.41
    A2=110.00
    D3=146.83
    G3=196.00
    B3=246.94
    E4=329.63


theme: "Bass Guitar Standard Tuning"
comment: "EADG using 12-TET tuning"
presets: 
    E1=41.204
    A2=55.000
    D3=73.416
    G3=97.999


...需要提取成这样的结构:


@class Preset

    NSString* label;
    double freq;


@class Theme

    NSString* label;
    NSMutableArray* presets;


NSMutableArray* themes;

如何使用 JSON 编写文件? (我想在用户方面创建最少的输入——我能做到多简洁?有人可以给我一个第一个主题的例子吗?)

以及如何使用https://github.com/johnezang/JSONKit 将其解析为结构?

【问题讨论】:

JSON 示例格式错误 仔细阅读问题(倒数第二段)。我从来没有写过 JSON,直到一个小时前我才知道它。 抱歉,我以为您在寻找 Objective-C 代码(将解析的对象导入到您的 Objective-C 结构中) 是的,这就是我要找的。但是没有使用过JSON,我不知道如何编写初始文件。所以这是一个双重问题......如何编写文件,然后如何将其复制到 ObjC 结构中。 使用 jsonlint.com 验证您的 json。 【参考方案1】:

这是一个基于您的想法的valid JSON 示例:

[
    
        "name": "Guitar Standard Tuning",
        "comment": "EADGBE using 12-TET tuning",
        "presets": 
            "E2": "82.41",
            "A2": "110.00",
            "D3": "146.83",
            "G3": "196.00",
            "B3": "246.94",
            "E4": "329.63"
        
    ,
    
        "name": "Bass Guitar Standard Tuning",
        "comment": "EADG using 12-TET tuning",
        "presets": 
            "E1": "41.204",
            "A1": "55.000",
            "D2": "73.416",
            "G2": "97.999"
        
    
]

使用 JSONKit 读取文件并解析:

NSData* jsonData = [NSData dataWithContentsOfFile: path];
JSONDecoder* decoder = [[JSONDecoder alloc]
                             initWithParseOptions:JKParseOptionNone];
NSArray* json = [decoder objectWithData:jsonData];

之后,您必须使用 for 循环遍历 json 变量。

【讨论】:

谢谢!这真的很有帮助!是否不可避免地要到处使用数以千计的“标记”? 答案有错误:应该是NSArray而不是NSMutableDictionary。它是一个字典对象数组。 @P i:谢谢,我实际上不确定但从未检查过【参考方案2】:

在您的问题中使用解析器并假设您在 NSString 变量中有 Simeon 的字符串。解析方法如下:

#import "JSONKit.h"


id parsedJSON = [myJSONString objectFromJSONString];

这将为您提供数组和字典的层次结构,您可以通过这些层次结构获取 PresetTheme 对象。在上面的例子中,你会得到一个包含两个字典的数组,每个字典都有一个namecommentpresets 键。前两个将有 NSString 值,第三个 (presets) 将有一个字典作为它的值,音符名称作为键,频率作为值(如 NSString 对象)。

【讨论】:

以上是关于使用 JSONKit 解析 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSONKit 在 iOS 中解析 JSON 数组 - 没有 ObjectForKey 标记的数组?

IOS 网络浅析-(七 JSON解析之三方JSONKit)

JSON解析(引入第三方JSONKit)

将对象添加到 JSONKit 创建的字典?

使用 JSONKit 处理 WordPress JSON 响应

JSONKit在从iphone中的Web服务解码JSON对象时更改浮点值