问题描述
我有多个JSON数据包,如下所示.
Hi I have multiple JSON Packets like I wrote below.
{
"data" : {
"lng" : 36.159999999999997,
"lat" : 50.359999999999999,
"accuracy" : 5
},
"header" : {
"type" : "loc"
}
}
还有这个
{
"data" : {
"time" : 15646565455,
"tz" : "+2",
"system" : 5
},
"header" : {
"type" : "syn"
}
}
我有用于数据包的结构,它可以用于一种数据包结构.但是如何将其用于多个数据包结构.
I have structure for my packets and it worked for one structure of packets. But how to use it for multiple packets structures.
struct Packet : Codable {
enum StructureType : String, Codable {
case location = "loc"
case synchronize = "syn"
}
enum Status: String, Codable {
case OK = "OK"
case NOT = "NOT"
}
struct Header: Codable {
let type: StructureType
let status: Status?
}
var header: Header
struct Data : Codable {
struct LocationStruct : Codable {
var lng: Double
var lat: Double
var accuracy: Double
}
struct SynchronizationStruct: Codable {
var time: Int
var tz: String
var locale: String
}
}
var data: Data
}
现在我要对JSON编码取决于我的数据
Now I want to encode JSON depends from my Data
let dataHeader = Packet.Header.init(type: .location, action: nil, ID: nil, dataID: nil, status: nil)
let dataData = Packet.Data.LocationStruct.init(lng: lng, lat: lat, accuracy: acc)
let dataObject = Packet.init(header: dataHeader, data: dataData)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try! encoder.encode(dataObject)
该怎么做,还是我需要对每个数据包使用数据结构的其他结构?
How to do that, or I need to use other structure of my data struct for each of packets?
推荐答案
我将拥有两个主要模型对象Location
和Synchronization
的结构.然后,我将它们定义为符合某种协议,在该协议中我们指定了如何知道哪种标头"适用于哪种类型的有效负载.然后,我将创建一个通用数据包,该数据包可以打包以下两种可能的有效负载:
I'd have structures for the two main model objects, Location
and Synchronization
. I'd then define them to conform to some protocol where we specified how we know which "header" goes for which type of payload. And I'd then make a generic Packet that can package these two possible payloads:
enum PayloadType: String, Codable {
case location = "loc"
case synchronize = "syn"
}
protocol Payload: Codable {
var payloadType: PayloadType { get }
}
struct Location: Payload {
let lat: Double
let long: Double
let accuracy: Double
let payloadType = PayloadType.location
enum CodingKeys: String, CodingKey {
case lat,long,accuracy
}
}
struct Synchronization: Payload {
let time: Int
let tz: String
let system: Int
let payloadType = PayloadType.synchronize
enum CodingKeys: String, CodingKey {
case time, tz, system
}
}
struct Packet<T: Payload>: Codable {
let data: T
let header: PayloadType
init(payload: T) {
data = payload
header = payload.payloadType
}
}
然后您可以执行以下操作:
Then you can do:
let location = Location(lat: 36.16, long: 50.36, accuracy: 5)
let packet = Packet(payload: location)
let json = try! encoder.encode(packet)
导致:
{
"data" : {
"lat" : 36.159999999999997,
"long" : 50.359999999999999,
"accuracy" : 5
},
"header" : "loc"
}
或
let location = Synchronization(time: 15646565455, tz: "+2", system: 5)
let packet = Packet(payload: location)
let json = try! encoder.encode(packet)
结果:
{
"data" : {
"system" : 5,
"time" : 15646565455,
"tz" : "+2"
},
"header" : "syn"
}
这篇关于具有多种结构的JSONEncoder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!