この下のクラス
class User: NSManagedObject {
@NSManaged var id: Int
@NSManaged var name: String
}
に変換する必要があります。
{
"id" : 98,
"name" : "Jon Doe"
}
辞書に変数をセットして辞書を返す関数に、手動でオブジェクトを渡してみました。しかし、私はこれを達成するためのより良い方法が欲しいです。
Swift 4では、「コード可能」タイプから継承できます。
struct Dog: Codable {
var name: String
var owner: String
}
// Encode
let dog = Dog(name: "Rex", owner: "Etgar")
let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(dog)
let json = String(data: jsonData, encoding: String.Encoding.utf16)
// Decode
let jsonDecoder = JSONDecoder()
let dog = try jsonDecoder.decode(Dog.self, from: jsonData)
Swift 4(Foundation)とともに、JSON文字列からオブジェクト-JSON文字列へのオブジェクト-両方の方法でネイティブにサポートされるようになりました。 Appleのドキュメントは[JSONDecoder()][1]とここ[JSONEncoder()][2]を参照してください。
JSON String to Object。
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let myStruct = try! decoder.decode(myStruct.self, from: jsonData)
オブジェクトをJSONStringにスイフトします。
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try! encoder.encode(myStruct)
print(String(data: data, encoding: .utf8)!)
すべての詳細と例は、Swift 4を使用したJSON解析の究極のガイドにあります。
[1]:https://www.google.com.tr/url?sa = t& rct = j& q =& esrc = s& source = web& cd = 1& cad = rja& uact = 8& ved = 0ahUKewj1jfLXrt_WAhWhJ5oKHbdEBswQFggnMAA& vop2 [2]:https://www.google.com.tr/url?sa = t& rct = j& q =& esrc = s& source = web& cd = 3& cad = rja& uact = 8& ved = 0ahUKewj654zqrt_WAhWFO5oKHRwaD-8QFggzMAI& r2
UPDATE: Swift 4で導入されたCodable
プロトコルは、JSON
のパースケースのほとんどに十分であるはずです。以下の答えは、Swiftの以前のバージョンで立ち往生している人々や、レガシーな理由のためのものです。
NSDictionary
、NSCoding
、Printable
、Hashable
、Equatable
もサポートします。例: 例: 例: 例: 例: 例: 例
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)
オブジェクトマッパー]2 :。
**例:***です。
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)
私は、継承を必要としないより小さな解決策に少し取り組みました。しかし、まだあまりテストしていません。かなり醜いものです。
https://github.com/peheje/JsonSerializerSwift
これをプレイグラウンドに渡してテストすることができます。例:以下のようなクラス構造:
//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)
プリント
{"name": "Apple", "color": null, "weight": 2.1, "diameter": 4.3, "radius": null, "isDelicious": true, "isRound": null, "nullString": null, "date": "2015-06-19 22:39:20 +0000", "optionalIntArray": [1, 5, 3, 4, null, 6], "doubleArray": [null, 2.2, 3.3, 4.4], "stringArray": ["one", "two", "three", "four"], "optionalArray": [2, 4, 1], "nutrient": {"name": "VitaminD", "amountUg": 4.2, "intArray": [1, 5, 9], "stringArray": ["nutrients", "are", "important"]}}
これは完璧/自動的なソリューションではありませんが、これが慣用的でネイティブの方法だと思います。 このようにして、ライブラリなどは必要ありません。
次のようなプロトコルを作成します。
/// 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] }
}
今:
let user = User(...)
let json = user.json()
注:「json」を文字列にする場合は、文字列に変換するだけです: String(data:json、encoding .utf8)
。
上記の回答の一部は完全に問題ありませんが、ここでは拡張機能を追加しました。これは、読みやすく、使いやすくするためです。
extension Encodable {
var convertToString: String? {
let jsonEncoder = JSONEncoder()
jsonEncoder.outputFormatting = .prettyPrinted
do {
let jsonData = try jsonEncoder.encode(self)
return String(data: jsonData, encoding: .utf8)
} catch {
return nil
}
}
}
struct User: Codable {
var id: Int
var name: String
}
let user = User(id: 1, name: "name")
print(user.convertToString!)
//これは次のように印刷されます。
{
"id" : 1,
"name" : "name"
}
lib/frameworkが存在するかは分かりませんが、もし自動で行いたい、手作業を避けたいのであれば、MirrorType
にこだわってください ...。
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
}
}
大まかな例として、適切な変換のサポートがない、再帰性がない、...。これは単なる MirrorType
のデモです.
追伸:ここでは U
で行っていますが、NSManagedObject
を強化し、すべての NSManagedObject
サブクラスで変換できるようにするつもりです。すべてのサブクラス/マネージドオブジェクトに実装する必要はない。
struct User:Codable{
var id:String?
var name:String?
init(_ id:String,_ name:String){
self.id = id
self.name = name
}
}
オブジェクトをこのようにします。
user = User( "1"、 "pawan")とします。
do{
let userJson = data: try JSONEncoder().encode(parentMessage), encoding:.utf8)
}catch{
fatalError("Unable To Convert in Json")
}
次に、jsonからObjectに再変換します。
let jsonDecoder = JSONDecoder()
do{
let convertedUser = try jsonDecoder.decode(User.self, from: userJson.data(using: .utf8)!)
}catch{
}