一个用于 OS X 和 iOS 的 EDN (可扩展数据表示) Objective C I/O 库。
该库包括
MPEdnParser
,一个用于读取 EDN 并生成等价 Cocoa 数据结构的解析器。
MPEdnWriter
,将 Cocoa 数据结构写入 EDN。
对于大多数用法,解析 EDN 简单如您所见
[@"{:a 1}" ednStringToObject];
它在出错时返回解析对象或 nil。
要从 Cocoa 对象生成 EDN
[myObject objectToEdnString];
请查看头文件以获取 API 文档。
0.2 版本将破坏现有的 - 不好意思!自动输出 NSDictionary 字符串键作为关键词(即 MPEdnWriter useKeywordsInMaps
属性)的默认设置已从 YES 更改为 NO。如果您希望保留 0.1 的行为,请使用 objectToEdnStringAutoKeywords
而不是 objectToEdnString
来生成 EDN 输出。
此外,关键词现在实现为 MPEdnKeyword
实例,而不是像 0.1 中的字符串。为了获得旧的行为,请将 keywordsAsStrings
属性设置在 MPEdnParser 上或使用 [NSString ednStringToObjectKeywordsAsStrings]
。
要使用该库,可以
使用提供的 Xcode 项目生成 libMPEdn.a
并将其以及 .h
文件复制到您的项目中,或者;
使用包含您的项目与 MPEdn 的 workspace,如此处所述。您可能还需要将 -all_load
标志添加到项目的 "其他链接器标志" 部分,如果链接器没有链接到 ednStringToObject
和 objectToEdnString
类别方法。
EDN 映射 <-> NSDictionary
(但请查阅 [MPEdnParser newDictionary]
以覆盖)。
EDN 列表或向量 <-> NSArray
(但请查阅 [MPEdnParser newArray]
以覆盖)。
EDN 集合 <-> NSSet
(但请查阅 [MPEdnParser newSet]
以覆盖)。
EDN 字符串 <-> NSString
。
EDN 浮点数 <-> NSNumber
(numberWithDouble
)。
EDN 整数 <-> NSNumber
(numberWithLong
)。不支持 N
(大整数)后缀。
EDN 十进制数('M' 后缀,Clojure 中的 BigDecimal
)<-> NSDecimalNumber
。
EDN 布尔值 <-> NSNumber
(numberWithBool
)。
EDN 字符 <-> NSNumber
(numberWithUnsignedChar
)。
EDN 关键字 <-> MPEdnKeyword
。如果 MPEdnWriter.useKeywordsInMaps
属性为 true(截至 0.2 版本默认为 false),用作 NSDictionary
键的字符串将尽可能以关键字的形式输出。请注意,字符串和关键字永远不会进行比较,因此当从使用关键字的外部服务中读取词典时可能会令人困惑:通常情况下,如果可能的话,应显式使用关键字。
EDN 符号 <-> MPEdnSymbol
。
通过实现 MPEdnTaggedValueWriter
和/或 MPEdnTaggedValueReader
的类可以将 EDN 带标签的值进行转换(有关示例,请参阅 MPEdnBase64Codec
)。您可以通过在 MPEdnParser
上设置 allowUnknownTags
属性来接受任意标签(无论是否为其提供了读取器),这将使用 MPEdnTaggedValue
实例表示未知带标签的值。MPEdnWriter
知道如何输出 MPEdnTaggedValue
,这使得带有未知标签的 EDN 能够往返。
未来可能会通过解析到映射值来更好地处理符号,无论是通过符号表还是用户定义的回调。
浮点数将被完整输出,以避免精度损失。
字符串中的换行将在其转义形式中输出(使用 \n
而不是原始的 0x0a
),尽管原始形式是合法的,这使得在行定向协议中使用生成的 EDN 字符串变得容易。
解析器和写入器完全支持字符串值中所有 Unicode 代码点(即普通字符和 UTF-16 代理对),但其他地方则不支持。添加一般支持会很简单,但可能会付出一些速度代价,但鉴于 EDN 语法是在 ASCII 字符类的基础上定义的,因此不清楚在使用字符串之外的任何情况下是否使用 ASCII 是否是有效的 EDN。
MPEdn 由 Matthew Phillips([email protected])开发。它使用与 Clojure 相同的开源许可协议,即 Eclipse 公共许可协议 v1.0。