0

我有一些 JSON,其中包含用于实例化的类的名称,并且我试图避免拼写错误导致事情崩溃。

我想知道是否无论如何我可以在 JSON 中插入字符串或常量,以减少出错的可能性......

例如:

{ "stuff": [
           { "class": "foo" } ] }

如果这是 ruby​​,我可以使这个 file.json.erb 能够执行以下操作:

{ "stuff": [
           { "class": "<%= FOO_CONSTANT %>" }] }

...

我想知道是否有什么方法可以用 XCode 和 Objective-C 做一些远程类似的事情

4

2 回答 2

1

如果你必须

如果您坚持(或以某种方式被迫)使用 JSON 文本字符串,则最好使用现成的模板库。

GRMustache https://github.com/groue/GRMustache是 ObjC 的 Mustache 模板库,非常适合生成非 HTML/XML,因为它实际上只是一个愚蠢的字符串插值器。GRMustache 页面上有大量文档,Mustache.js会自行解释(虽然是以 HTML 为中心的方式。)

最终,您可以:

{ "stuff": [
       { "class": "{{ FOO_CONSTANT }}" } ] }

另一方面,DMTemplates https://github.com/mierau/DMTemplates是一个更通用的模板库。

此 NSString 文字中的示例模板语法:

engine.template = @"{ \"stuff\": [\n { \"class\": \"<? FOO_CONSTANT />\" } ] }";

您可以通过字典为其提供值,它还具有一些不错的功能,例如foreach循环甚至函数调用来填充值。当然,模板可以位于 unicode 文本文件中,并在运行时以解释的形式读取,而不是硬字符串。

最后,我注意到 M4 模板/宏语言在 ObjC 世界中并没有得到太多的喜爱,它是许多 C/C++ 程序员生成文本的老生常谈。(由您可能知道的 Brian Kernighan 和 Dennis Ritchie 设计。)看看一个非常古老的模板库及其所具有的功能(现在大约 40 年)可能具有教育价值

但是,我认为DMTemplate是您想要的“它只是有效”的解决方案。({{ braces }}Mustache 中的那些也会让我在使用 JSON 时感到紧张。)

顺便说一句,还有 MGTemplate 引擎,但它又使用了双括号,所以对于生成 JSON 不是很好。

理想吗?

好吧,我建议您在此构建一个带有模板引擎废话的 JSON 字符串,并构建一个 NSDictionary / NSArray 对象的集合并使用NSJSON或任何其他流行的 ObjC JSON 库将它们序列化,这样您就可以消除任何格式/引用错误垃圾. 最终无论你做什么都是从数据开始的,所以这确实是处理它的方法,像 JSON 这样的传输格式的想法不是手工编写它们,除非有人拿着枪指着你的头,(但这很好如果它们可以打印得很漂亮,那么您就可以阅读它们。)所以...呃,这样做,对吗?对。

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

于 2013-01-04T13:50:04.487 回答
0

您可以在解析之前遍历键名并替换它们吗?就像是:

NSMutableString *jsonString = …;

NSDictionary *environment = @{
    @"FOO_CONSTANT" : @"foo"
};

for (NSString *key in [environment allKeys]) {
    NSString *pattern = [NSString stringWithFormat:@"<%= %@ %>", key];
    [jsonString replaceOccurrencesOfString:pattern withString:environment[key]];
}

当然,这假定键和值是纯字母字符串,因此您不能破坏 JSON 语法。

于 2013-01-04T07:25:25.003 回答