class User: EVObject { # extend EVObject method for the class
var id: Int = 0
var name: String = ""
var friends: [User]? = []
}
# use like below
let json:String = "{\"id\": 24, \"name\": \"Bob Jefferson\", \"friends\": [{\"id\": 29, \"name\": \"Jen Jackson\"}]}"
let user = User(json: json)
一个电子一个电子一个电子:**
另一种方法是使用ObjectMapper,这提供了更多的控制,但也需要更多的代码。
示例:**
class User: Mappable { # extend Mappable method for the class
var id: Int?
var name: String?
required init?(_ map: Map) {
}
func mapping(map: Map) { # write mapping code
name <- map["name"]
id <- map["id"]
}
}
# use like below
let json:String = "{\"id\": 24, \"name\": \"Bob Jefferson\", \"friends\": [{\"id\": 29, \"name\": \"Jen Jackson\"}]}"
let user = Mapper<User>().map(json)
//Test nonsense data
class Nutrient {
var name = "VitaminD"
var amountUg = 4.2
var intArray = [1, 5, 9]
var stringArray = ["nutrients", "are", "important"]
}
class Fruit {
var name: String = "Apple"
var color: String? = nil
var weight: Double = 2.1
var diameter: Float = 4.3
var radius: Double? = nil
var isDelicious: Bool = true
var isRound: Bool? = nil
var nullString: String? = nil
var date = NSDate()
var optionalIntArray: Array<Int?> = [1, 5, 3, 4, nil, 6]
var doubleArray: Array<Double?> = [nil, 2.2, 3.3, 4.4]
var stringArray: Array<String> = ["one", "two", "three", "four"]
var optionalArray: Array<Int> = [2, 4, 1]
var nutrient = Nutrient()
}
var fruit = Fruit()
var json = JSONSerializer.toJson(fruit)
print(json)
/// A generic protocol for creating objects which can be converted to JSON
protocol JSONSerializable {
private var dict: [String: Any] { get }
}
extension JSONSerializable {
/// Converts a JSONSerializable conforming class to a JSON object.
func json() rethrows -> Data {
try JSONSerialization.data(withJSONObject: self.dict, options: nil)
}
}
然后在类中实现它,例如:
class User: JSONSerializable {
var id: Int
var name: String
var dict { return ["id": self.id, "name": self.name] }
}
class U {
var id: Int
var name: String
init(id: Int, name: String) {
self.id = id
self.name = name
}
}
extension U {
func JSONDictionary() -> Dictionary<String, Any> {
var dict = Dictionary<String, Any>()
let mirror = reflect(self)
var i: Int
for i = 0 ; i < mirror.count ; i++ {
let (childName, childMirror) = mirror[i]
// Just an example how to check type
if childMirror.valueType is String.Type {
dict[childName] = childMirror.value
} else if childMirror.valueType is Int.Type {
// Convert to NSNumber for example
dict[childName] = childMirror.value
}
}
return dict
}
}
// get JSON from Object
configCreds
.asJson()
.onSuccess{ varToSaveJson = $0 }
.onFailure{ _ in // any failure code }
// get object of type "ConfigCreds" from JSON
someJsonString
.decodeFromJson(type: ConfigCreds.self)
.onSuccess { configCreds = $0 }
.onFailure{ _ in // any failure code }
9条答案
按热度按时间oxosxuxt1#
在Swift 4中,可以从
Codable
类型继承。qlfbtfca2#
沿着Swift 4(Foundation)的推出,现在它在两种方式上都得到了原生支持,即JSON字符串到对象-对象到JSON字符串。请参阅Apple文档JSONDecoder()和JSONEncoder()
JSON字符串到对象
Swift对象到JSON字符串
您可以在此处找到所有详细信息和示例Ultimate Guide to JSON Parsing With Swift 4
cbwuti443#
Codable
协议应该足以满足大多数JSON
解析情况。以下答案是针对那些因遗留问题而无法使用Swift早期版本的用户NSDictionary
、NSCoding
、Printable
、Hashable
、Equatable
ctehm74n4#
我曾经研究过一个不需要继承的小解决方案,但是它还没有经过很多测试,它是相当丑陋的atm。
https://github.com/peheje/JsonSerializerSwift
你可以把它放到操场上测试一下。例如,下面的班级结构:
印刷品
cwxwcias5#
这不是一个完美的/自动的解决方案,但我相信这是一个惯用的和本地的方法,这样你就不需要任何库或类似的东西了。
创建协议,例如:
然后在类中实现它,例如:
现在:
注意:如果你想要
json
作为一个字符串,它是非常简单的转换成一个字符串:String(data: json, encoding .utf8)
btqmn9zl6#
上面的一些答案是完全正确的,但是我在这里添加了一个扩展,只是为了使它更具可读性和可用性。
//这将打印如下:
e7arh2l67#
不确定lib/framework是否存在,但如果您希望自动完成,并且希望避免手工劳动:-)坚持使用
MirrorType
...把它作为一个粗略的例子,缺乏适当的转换支持,缺乏递归,...它只是
MirrorType
演示...P.S.这里是在
U
中完成的,但是你将增强NSManagedObject
,然后你将能够转换所有NSManagedObject
子类。没有必要在所有子类/托管对象中实现这一点。dgsult0t8#
现在把你的物体做成这样
让用户=用户(“1”,“pawan”)
然后从json重新转换为Object
xqkwcwgp9#
2021年|SWIFT 5.1|结果溶液
输入数据:
用法:
返回代码: