如何在JSON中序列化ObjC枚举?

时间:2010-02-28 13:45:23

标签: ios objective-c json

我想将我的应用程序的皮肤设置存储在json文件中。我如何存储颜色/样式等的枚举值,然后从字符串中转换回来?我如何存储MKPinAnnotationColorRed或UITableViewStyleGrouped?

如果只是存储等价整数的问题,我就可以了,而不是实际存储枚举字符串值。

3 个答案:

答案 0 :(得分:3)

“我想将我的应用程序皮肤设置存储在json文件中” - 这是iPhone上的错误方法。操作系统提供了NSUserDefaults类,可以为您处理所有细节。

例如,要存储枚举值(实际上是整数值):

[[NSUserDefaults standardUserDefaults] setInteger: annotationColor
    forKey: @"SomeKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

您还可以轻松存储和检索序列化对象或本机类型(数组,字母,数字,字符串)。

答案 1 :(得分:3)

简短的回答是,你不能。

除非你做了几件事之一:

  1. 将枚举的整数值存储在json文件中。 (这是你的“如果它只是存储整数等效的问题,而不是实际存储枚举字符串值”,这似乎是最简单,最好的解决方案)。
  2. 将一个单独的枚举值数组保存为字符串,并与它们进行比较并返回正确条目的索引。
  3. 不使用枚举,而是使用字符串常量。
  4. 使用四个字符的常量代替枚举,可以将其解析为整数或字符串。

答案 2 :(得分:2)

您必须在枚举和字符串之间创建一些显式映射。一种方法如下:

#define ENTRY(x) [NSNumber numberWithInt:x], @#x

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
    ENTRY(enumOne),
    ENTRY(enumTwo),
    ENTRY(enumThree),
    nil];

#undef ENTRY

NSNumber* index = [dict objectForKey:@"enumOne"]);

请注意,这是一般方法,如果您具有等距的枚举值,则不必存储其数值并且可以使用例如改为NSArray