【问题标题】:How to parse a NSDictionary Array with PHP如何使用 PHP 解析 NSDictionary 数组
【发布时间】:2013-01-11 15:03:38
【问题描述】:

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

模块返回的数组如下所示:

{
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 模块 Classes,发现它使用 NSDictionary 类返回 EXIF 数据。

我尝试了一些 PHP Plist 解析来处理这个数组,但它们都没有真正起作用。我不知道如何解析这个数组。

提前致谢!

【问题讨论】:

  • 在将其发送到 PHP 之前,最好在 Objective-c 中进行转换,您可以将 NSDictonary 转换为 JSON (stackoverflow.com/questions/6368867/…),然后在您的 API 中执行 json_decode()
  • 是的,在 Objective-C 端将其转换为 JSON。除其他外,您上面的description 格式没有“定义”,可能会随Apple 的心血来潮而改变。

标签: php objective-c arrays titanium nsdictionary


【解决方案1】:

从模块中获取结果并将其转换为字符串。将字符串传递到您的服务器并将其转换回 JSON...我不是 php 人,但我猜有一种方法可以在 php 中解析 JSON?

【讨论】:

    【解决方案2】:

    这似乎是一个老式的 ASCII 属性列表。您可能找不到这种格式的任何解析器,因为它几乎不再用于交换 - AFAIK 唯一可以解析它的是 Apple 自己的库,我不确定它们是否支持这种破旧的旧格式。您可能是从 NSDictionary 的 description 方法中得到的,该方法并非用于此目的。要准备发布到服务器的数据,首先通过 NSJSONSerialization 运行它并发送它。然后你将处理普通的 JSON。 (您也可以通过 NSPropertyListSerialization 运行它并使用您找到的 plist 库,但是考虑到这两个选项,我不明白您为什么会选择那个。)

    【讨论】:

    • 在我看来,这确实像是一个 NSDictionary 的 description 转储——很容易转换为 JSON。
    • @HotLicks:并不像一开始就提供 JSON 那样简单。是的,转换为 JSON 相当容易,但是您可能会忘记在解析器中处理一些极端情况——无论您最终是否关心这些,它总是比运行数据更费力通过客户端的 NSJSONSerialization。故意发送-[NSDictionary description] 是不可靠的——它不能保证是任何特定的格式——并且在服务器端编写一个 ASCII-plist-to-JSON 转换器来处理这个错误的决定而不是修复它是疯了 IMO
    • 我就是这么说的。获取原始 JSON,或者如果它在 NSDictionary 中,则在 Objective-C 端进行转换。无论如何,以上不是 plist,而是 NSDictionary 描述。
    • @HotLicks:啊,我以为你是说将字符串转换为 JSON 是最简单的方法。我的错。至于它是 plist 还是“NSDictionary 描述”:AFAIK 两者兼而有之。我很确定只有值对象的 NSDictionary 的描述只是字典的旧式 plist。
    • 反之亦然——你熟悉的“plist”是一个 NSDictionary 描述。 plist 的实际存储形式是 XML。
    【解决方案3】:

    我找到了解决方案! 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"
    

    现在在 Appcelerator Titanium 中,只需使用 event.JSONMeta 而不是 event.metadata

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

    感谢您的所有帮助!我从来没有用 Objective-C 写过代码,所以很难开始,但毕竟解决方案很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多