- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用正在交付 this object to me 的远程图书馆.
如果我设置调试器,我会得到以下信息:
KandyChatMessage: UUID - 70886A79-2FF60F5E1A3961EF , timestamp - 2017-02-13 17:46:12 +0000 , sender - uri - 3@domain.domain.com, userName - 3, domain - domain.domain.com, type - 0, associationType - 1 , recipient - uri - afdab3bfb5774@domain.domain.com, userName - afdab3bfb57a12b5, domain - domain.domain.com, type - 1, associationType - 1 , type: - 1 , mediaItem - KandyTextMessageData - text:3 , info:(null) , isIncoming - 1 , additionalData - (null), fromHistory - NO
它是通过这种方法传递的:
-(void)_addEventAndRefresh:(id<KandyEventProtocol>)event{
目标是将此对象转换为 JSON,格式如下:
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:event
options:0
error:&error];
但是,这会导致我的应用程序崩溃,因为我假设 event
不满足可序列化的 NSMUtableArray
或 NSDictionary
的所有规则一些原因。
这让我有两个选择。第一,我可以找到一些巧妙的方法将任何对象转换为 JSON。或者两个,我可以挑选出它的数据并从头开始编写一个 NSDictionary 对象。
有人知道如何拆开这种物体吗?
在我的调试器
中,它似乎没有任何响应..
> po event.UUID
=> error: property 'UUID' not found on object of type 'id'
> po event.timestamp
=> error: property 'timestamp' not found on object of type 'id'
最佳答案
您是对的,该对象可能无法序列化为 JSON,因为它 doesn't qualify in one or all of these ways .简而言之,它必须是字符串、数字和其他集合的集合,不能是别的。
This answer suggests如果你知道这个类,一种获取属性的方法。简而言之,它依赖于 objc_property_t *properties = class_copyPropertyList(klass, &outCount);
来获取属性。
您可以使用它来获取对象的 JSON 可序列化属性,将它们的值(以它们的名称作为键)放入字典中。然后用 JSON 序列化它。
编辑为了演示,我将此方法添加到其他答案建议的 PropertyUtil 类中......
+ (id)jsonSerializableFromObject:(id)object {
if ([object isKindOfClass:[NSString self]] ||
[object isKindOfClass:[NSNumber self]] ||
[object isKindOfClass:[NSNull self]]) {
return object;
} else if ([object isKindOfClass:[NSArray self]]) {
NSMutableArray *result = [NSMutableArray array];
for (id e in (NSArray *)object) {
id element = [self jsonSerializableFromObject:e];
[result addObject:element];
}
return result;
} else if ([object isKindOfClass:[NSArray self]]) {
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (id key in [(NSDictionary *)object allKeys])
result[key] = [self jsonSerializableFromObject:(NSDictionary *)object[key]];
return result;
} else {
NSMutableDictionary *result = [NSMutableDictionary dictionary];
NSDictionary *props = [PropertyUtil classPropsFor:[object class]];
for (NSString *propName in [props allKeys]) {
id value = [object performSelector:NSSelectorFromString(propName)];
result[propName] = [self jsonSerializableFromObject:value];
}
return (result.count)? result : [NSNull null];
}
}
这里只是一个简单的草图:如果操作数可以序列化为 JSON,则返回它。如果操作数是数组,则回答每个元素的数组,使 json 可序列化。如果是字典也一样。否则,如果对象是任意的,应用内省(introspection)方法来获取它的属性,为每个属性调用 getter 并回答它的 json-serializable。
关于ios - 有没有办法从这个晦涩的对象中获取属性并将其转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42210433/
我是一名优秀的程序员,十分优秀!