将结构数组转换为json swift

将结构数组转换为json swift,swift,Swift,我有一个需要写入服务器端代码的结构数组,我似乎找不到任何添加具有多个父键的json对象的示例 struct Photo { var imageName = "", thumbFileURL = "", viewCount = 0, likeCount = 0 } 然后我有一对照片对象,声明为 var photo1 = Photo() photo1.imageName = "ImPhoto1" photo1.thumbFileURL = "www.SO.com" photo1.viewC

我有一个需要写入服务器端代码的结构数组,我似乎找不到任何添加具有多个父键的json对象的示例

struct Photo {
    var imageName = "", thumbFileURL = "", viewCount = 0, likeCount = 0
}
然后我有一对照片对象,声明为

var photo1 = Photo()
photo1.imageName = "ImPhoto1"
photo1.thumbFileURL = "www.SO.com"
photo1.viewCount = 5
photo1.likeCount = 1

var photo2 = Photo()
photo1.imageName = "ImPhoto2"
photo1.thumbFileURL = "www.SO.com"
photo1.viewCount = 10
photo1.likeCount = 2
////// and then same for x amount of Photo() object
然后我有一个数组

myArray = [photo1,photo2,photo3, ...]
然后我需要写一个json,看起来像这样:

myJson object = {
    photo1: {
        imageName: "ImPhoto1"
        thumbFileURL = "www.SO.com"
        viewCount: 5
        likeCount: 1
    },
    photo2: {
        imageName: "Imphoto2"
        ....
    },
    ....
}
所以我的问题是,如何转换
myarray
->
myJson

struct Photo:Codable {
    var imageName = "", thumbFileURL = "", viewCount = 0, likeCount = 0
}

var photo1 = Photo()
photo1.imageName = "ImPhoto1"
photo1.thumbFileURL = "www.SO.com"
photo1.viewCount = 5
photo1.likeCount = 1

var photo2 = Photo()
photo1.imageName = "ImPhoto2"
photo1.thumbFileURL = "www.SO.com"
photo1.viewCount = 10
photo1.likeCount = 2
var myArray = [photo1,photo2]
let tempData = try? JSONEncoder().encode(myArray)
//Create JSON
var Finaldata: Any?
if let data = tempData { Finaldata = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) } 

这将起作用

您需要一个自定义的
可编码
实现,它是一组照片的包装类型:

struct Photo : Codable {
    var imageName = "", thumbFileURL = "", viewCount = 0, likeCount = 0
}

struct PhotoCollection: Encodable, ExpressibleByArrayLiteral {
    var photos: [Photo]

    typealias ArrayLiteralElement = Photo

    init(arrayLiteral elements: Photo...) {
        photos = elements
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        for (i, photo) in photos.enumerated() {
            try container.encode(photo, forKey: CodingKeys(stringValue: "photo\(i + 1)")!)
        }
    }

    struct CodingKeys: CodingKey, ExpressibleByStringLiteral {
        var stringValue: String { return key }

        init?(stringValue: String) {
            key = stringValue
        }

        var intValue: Int? { return Int(key) }

        init?(intValue: Int) {
            key = "\(intValue)"
        }

        init(stringLiteral value: String) {
            key = value
        }

        var key: String
    }
}

var photo1 = Photo()
photo1.imageName = "ImPhoto1"
photo1.thumbFileURL = "www.SO.com"
photo1.viewCount = 5
photo1.likeCount = 1

var photo2 = Photo()
photo1.imageName = "ImPhoto2"
photo1.thumbFileURL = "www.SO.com"
photo1.viewCount = 10
photo1.likeCount = 2

let photoCollection: PhotoCollection = [photo1, photo2]
let json = try JSONEncoder().encode(photoCollection)
print(String(data: json, encoding: .utf8)!)
这张照片是:

{"photo2":{"imageName":"","likeCount":0,"viewCount":0,"thumbFileURL":""},"photo1":{"imageName":"ImPhoto2","likeCount":2,"viewCount":10,"thumbFileURL":"www.SO.com"}}
格式:

{
  "photo2": {
    "imageName": "",
    "likeCount": 0,
    "viewCount": 0,
    "thumbFileURL": ""
  },
  "photo1": {
    "imageName": "ImPhoto2",
    "likeCount": 2,
    "viewCount": 10,
    "thumbFileURL": "www.SO.com"
  }
}

让tempData=try?JSONEncoder().encode(myArray)//创建JSON变量Finaldata:Any?如果let data=tempData{finalData=try?JSONSerialization.jsonObject(with:data,options:.allowFragments)}致命错误:数组不符合可编码的,因为照片不符合可编码的:很好!几乎,我该怎么做才能向数据中添加父键呢?像“Photo1”和“Photo2”键?你确定这是OP想要的吗?这会创建一个JSON数组,但OP需要一个JSON对象。@Cristik检查问题OP使用了相同的值这就是为什么如果我已经有一个照片数组,我如何将数组解码为PhotoCollection?我似乎无法运行代码:Photocollection:Photocollection=myarray..@RyanB。你想解码和编码吗?您的json看起来像什么?