iOS - CLLocationCoordinate2D / floats / long成为JDS的NSDictionary?

时间:2013-03-30 03:40:25

标签: objective-c json

我正在寻找将一个简单的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浮动等?

3 个答案:

答案 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)

的Structs

这样做的好方法是为理解你的结构的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可以,NSValueNSArrayNSDictionary等等,以及更多可变版本,您就可以放置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]等取消标记值。

希望有所帮助。