【问题标题】:Serializing a Swift class to JSON using J2ObjC and GSON library使用 J2ObjC 和 GSON 库将 Swift 类序列化为 JSON
【发布时间】:2015-10-08 09:45:52
【问题描述】:

我是 iOS 的新手,从 Android 开发开始。

我们有一个 Android 应用程序,其中包含多个库,我们使用 J2ObjC 将其转换为 Objective C。

我一直在逐渐引入图书馆,到目前为止,一切都很好。

但是,在翻译 Google 的 GSON 库后,我遇到了一个问题,如果我尝试使用已翻译的方法 toJsonWithId 我会遇到问题:

    let gson = ComGoogleGsonGson()
    let swiftTest = GsonSwiftTest()
    swiftTest.name = "Ricky"
    print(gson.toJsonWithId(swiftTest))

我收到以下错误:

libc++abi.dylib:以未捕获的类型异常终止 JavaLangAssertionError

进一步说明:

由于未捕获的异常“JavaLangAssertionError”而终止应用程序, 原因:'未知的 Java 类型编码'

我的 Swift 课程是:

import Foundation

@objc
public class GsonSwiftTest : NSObject {

   var name:String?

}

如果我在我的 Swift 项目中改用 Objective C 类,请将其添加到桥接头并使用 Objective C 类,它可以正常工作。

我认为这是我的一个误解,但我找不到为什么这不起作用的答案。检查 J2ObjC 源代码显示当找不到类的类型时会引发错误。

如果有人可以帮助解释此问题的原因,我们将不胜感激。

谢谢!

【问题讨论】:

    标签: ios objective-c swift gson j2objc


    【解决方案1】:

    序列化 Swift 实例有一个更简单的方法:直接使用 Foundation 类 NSJSONSerialization。这是一篇相关的博文:JSON Serialization in Swift。

    您的测试在 Swift 中失败的原因是并非所有 Swift 类都扩展了 NSObject,j2objc 映射到 java.lang.Object。所有 Java 序列化框架都假定/要求所有类都扩展 Object,就像它们在 Java 中所做的那样。

    对于跨平台 API,我建议创建一个简单的序列化/反序列化接口,然后使用 GSON 为 Android 实现一次,并使用 NSJSONSerialization 在本机实现一次。 Swift 发展迅速,因此如果有更好的序列化机制可用,您的项目可以轻松利用它,而不会影响 Android 端口。

    【讨论】:

    • 谢谢汤姆,我知道 NSJSONSerialization,我只是想了解失败的原因,你现在已经解释过了。感谢您在图书馆的辛勤工作。
    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 2012-04-19
    • 2015-11-04
    • 2020-10-08
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多