我正在寻找将一个简单的objectiveC类(在某个时候甚至不是函数中的某些变量)转换为JSON,以便可以将它发送并强制插入到服务器端的java对象中。
该类可能包含以下字段;
LatLng locationA // a simple POJO with either float or long to represent lat and long.
LatLng locationA
float someFloat
我想把所有东西都包装到NSDictonary中。通过浮动没有工作,所以我必须将它们转换为NSStrings。因此,在服务器端,他们将成为字符串...这是不理想的。
CLLocationCoordinate2D location = ... ;
float lat = location.latitude;
float lng = location.longitude;
float aFloat = 0.12434f;
NSString *aFloatstr = [NSString stringWithFormat:@"%f", aFloat];
NSString *latStr = [NSString stringWithFormat:@"%f", lat];
NSString *lngStr = [NSString stringWithFormat:@"%f", lng];
NSDictionary *locationDictionary =
[NSDictionary dictionaryWithObjectsAndKeys:
latStr , @"latitude",
lngStr, @"longitude",
nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
locationDictionary, @"locationA",
locationDictionary, @"locationB",
aFloatstr,@"aFloat",
nil];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString *str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
将CLLocationCoordinate2Ds放入NSDictionary的最佳方法是什么?
如何向NSDictionary添加初始类型,long浮动等?
答案 0 :(得分:4)
不是将纬度和经度放入NSString
,而是NSNumber
会更好运。当NSJSONSerialization
出现NSNumber
时,它不会引用该值,就像字符串一样(这是您在传输数字时所需要的,对吧?)。
您还希望使用double
而不是float
来获取纬度和经度,因为它们是如何在内部表示的。无需抛弃精确度。
[NSNumber numberWithDouble:lat]
[NSNumber numberWithDouble:lng]
[NSNumber numberWithFloat:aFloat]
由于NSNumber
的实例是对象,您可以将它们存储在NSDictionary
中没问题。
答案 1 :(得分:1)
使用NSNumber
代替字符串来包装float
值,例如:
NSDictionary *locationDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat:lat] , @"latitude",
[NSNumber numberWithFloat:lng], @"longitude", nil];
这样,NSJSONSerialization
会将它们正确编码为数值。
答案 2 :(得分:0)
这样做的好方法是为理解你的结构的NSValue创建类别。在你的情况下它是CLLocationCoordinate2D
,但可能是真的。以下是Apple自己的文档摘录,解释了NSValue
的使用情况:
// NSValue+Polyhedron.h
typedef struct {
int numFaces;
float radius;
} Polyhedron;
@interface NSValue (Polyhedron)
+ (instancetype)valueWithPolyhedron:(Polyhedron)value;
@property (readonly) Polyhedron polyhedronValue;
@end
// NSValue+Polyhedron.m
@implementation NSValue (Polyhedron)
+ (instancetype)valueWithPolyhedron:(Polyhedron)value
{
return [self valueWithBytes:&value objCType:@encode(Polyhedron)];
}
- (Polyhedron) polyhedronValue
{
Polyhedron value;
[self getValue:&value];
return value;
}
@end
从这里使用非常简单。要创建盒装NSValue:
NSValue *boxedPolyhedron = [NSValue valueWithPolyhedron:yourStruct];
现在,只要boxedPolyhedron
可以,NSValue
,NSArray
,NSDictionary
等等,以及更多可变版本,您就可以放置NSSet
。< / p>
获取结构:
Polyhedron polyStruct = [boxedPolyhedron polyhedronValue];
就是这样。
作为奖励,这适用于任何C类型,不仅适用于结构。
如上所述,可以如上所述。但是,对于数字,您可以使用NSNumber
,如果NSValue
已经实现了所有常用方法,那么它实际上是一个子类。以下是您可以通过实例化NSNumber
来填充的类型列表:
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value;
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value;
以类似方式,您可以使用[yourNumber longValue]
,[yourNumber floatValue]
等取消标记值。
希望有所帮助。