2013-01-11 41 views
0

我正在用Appcelerator Titanium构建一个应用程序。它有一个照片上传功能,所以我构建了一个PHP后端(CodeIgniter + RESTful Server)来处理上传的文件。由于Titanium会从照片中删除EXIF数据,因此我使用myMedia module来获取EXIF数据,因此我仍然可以将EXIF数据发布到PHP后端。如何用PHP解析NSDictionary数组

该模块返回看起来像这样的数组:

{ 
exif =  { 
    ApertureValue = "2.970853567123413"; 
    BrightnessValue = "5.906054496765137"; 
    ColorSpace = 1; 
    ComponentsConfiguration =   (
     0, 
     0, 
     0, 
     1 
    ); 
    DateTimeDigitized = "2012:12:22 12:59:56"; 
    DateTimeOriginal = "2012:12:22 12:59:56"; 
    ExifVersion =   (
     2, 
     2, 
     1 
    ); 
    ExposureMode = 0; 
    ExposureProgram = 2; 
    ExposureTime = "0.007936508394777775"; 
    FNumber = "2.799999952316284"; 
    Flash = 16; 
    FlashPixVersion =   (
     1, 
     0 
    ); 
    FocalLenIn35mmFilm = 35; 
    FocalLength = "3.849999904632568"; 
    ISOSpeedRatings =   (
     80 
    ); 
    MeteringMode = 5; 
    PixelXDimension = 2592; 
    PixelYDimension = 1936; 
    SceneCaptureType = 0; 
    SensingMethod = 2; 
    ShutterSpeedValue = "6.973695755004883"; 
    SubjectArea =   (
     1295, 
     967, 
     699, 
     696 
    ); 
    WhiteBalance = 0; 
}; 
location =  { 
    latitude = "52.51933333333334"; 
    longitude = "13.40083333333333"; 
}; 
path = "assets-library://asset/asset.JPG?id=E5040F0C-C86A-411B-ADA8-36C9EC91A526&ext=JPG"; 
} 

我已经做了一些网络上的研究,以找出这是什么类型的数组,这似乎是一个的plist(XML)来我。我已经浏览了myMedia模块类,并且发现它使用NSDictionary类来返回EXIF数据。

我已经尝试了一些PHP Plist解析来处理这个数组,但是他们都没有工作。我不知道如何解析这个数组。

在此先感谢!

+5

它可能最好将其发送到PHP之前将其转换在Objective-C,你可以NSDictonary转换成JSON(http://stackoverflow.com/questions/6368867/generate-json-string-from-nsdictionary),然后在你的API中做一个'json_decode()'。 – Prisoner

+0

是的,将其转换为Objective-C端的JSON。除此之外,上面描述的'description'格式不是“定义”的,并且可能会随着Apple的意外而改变。 –

回答

0

我找到了解决方案! JSONkit解决了我的问题。 Apple自己的JSON库不起作用,它无法将NSDictionary对象转换为JSON字符串。

MyMediaModule.M插入此字符串(后线1473):

NSString *JSONMeta = [metadata JSONString]; 

然后我更换线路1475:

//[dictionary setObject:dictMeta forKey:@"metadata"]; 
[dictionary setObject:JSONMeta forKey:@"JSONMeta"]; 

而且不要忘了包括JSONkit库:

#import "JSONKit.h" 

Now in Appcelerator Titanium只需使用event.JSONMeta,而不是event.metadata

mymedia.openPhotoGallery({ 
    success:function(event) 
    { 
     Ti.API.info(event.JSONMeta); 
    } 
} 

感谢您对您的帮助!我从来没有在Objective-C语言编写的,因此是十分困难的开始,但所有的解决方案后,是很简单的。

0

从模块获取结果并将其转换为字符串。将字符串传递给您的服务器,并将其转换回JSON ...我不是一个PHP的家伙,但我猜测有一种方法来解析JSON在PHP?

0

这看起来是旧式的ASCII属性列表。你可能不会发现任何解析器这种格式,因为它几乎不会被用来交换了 - AFAIK只可以分析它是苹果公司自己的图书馆的事,我不知道他们甚至支持这种摇摇欲坠的旧格式。你可能从NSDictionary的description方法中得到了这个,它不是为此目的而设计的。要准备发布到服务器的数据,请先通过NSJSONSerialization运行并发送。然后你会处理普通的JSON。 (您也可以通过NSPropertyListSerialization运行它,并使用您找到的plist库,但给出这两个选项后,我看不出为什么要选择那一个。)

+0

当然看起来像一个NSDictionary的'description'转储给我 - 很容易转换为JSON。 –

+0

@HotLicks:并不像仅仅提供JSON那么简单。是的,转换为JSON相当容易,但是在解析器中可能会忘记处理一些角落案例 - 无论您最终是否关心这些问题,它总会比仅运行数据做更多的工作通过NSJSONSerialization在客户端。故意发送' - [NSDictionary描述]'是不可靠的 - 它不能保证以任何特定的格式 - 并且在服务器端编写一个ASCII-plist-to-JSON转换器来处理这个不好的决定而不是修复它是坚果IMO – Chuck

+0

这就是我所说的。获取原始的JSON,或者如果它在NSDictionary中,则在Objective-C一侧进行转换。无论如何,以上不是plist,它是一个NSDictionary描述。 –