如何制作一个 swift Codable 结构,它将解码和编码 JSON 中的 MongoDB _id ObjectId()
How to make a swift Codable struct that will decode and encode a MongoDB _id ObjectId() in JSON
我是一个非常新的开发人员(这是我的第一份开发工作)为 creating/processing 订单构建了一个 Swift/iOS 应用程序,并且服务器正在 [= 中向我发送一个 ObjectID() 对象48=] 我查找的每个产品。经过一些研究,这似乎是一个 MongoDB 对象。
编码我的 API 路由的绅士要我为服务器发送给我的每个产品抓取该对象,这样我就可以将它与包含该产品的任何订单一起发送回服务器。他说这将使他在处理新订单时更容易访问产品。
到目前为止,我在解码服务器发送给我的 JSON 时没有遇到任何问题,因为它的格式包括 String、Int、Float 等,或者只是另一种 JSON需要一个充满更多相同结构的新 Codable 结构的对象。
在为 ObjectID 创建 Codable 结构时,我不知道要告诉它什么 keys/value 类型(properties/value 类型,无论您想使用什么术语)。或者如果这甚至是正确的方法。
这是我现在拥有的:
import Foundation
struct ProductData: Codable {
let _id : ObjectId
let productId : String
let description : String
let ...
}
上面出现的 ObjectId 类型是我尚未构建的自定义 Codable 结构,因为我不确定如何构建。我想它应该看起来像这样:
import Foundation
struct ObjectId : Codable {
let someVariableName : SomeCodableType
let ...
}
我不知道变量名或类型是什么。我知道它里面有一个时间戳和一些其他信息,而且我已经读到它被表示为一个字符串,但是如果我在我的产品 Codable 结构中尝试类似 let _id:String
的东西,我会有这种感觉,它不会 decode/encode 我想象的那样。
我想知道如何构建一个 "type" 来正确 catch/decode 向我抛出的 _id 对象。如果有一种方法可以在不解码的情况下简单地保存该数据,并在以后需要时将其发回,那也适合我的目的。
编辑:
经过一些实验,我发现 _id 对象的原始 JSON:
"_id":{"$id":"58071f9d3f791f4f4f8b45ff"}
Swift variable/property 名称中不允许使用美元符号,因此我不确定如何以同时满足传入和传出的方式进行 - 我可以手动制作自定义密钥初始化 JSON 以便它可以与 Swift 一起正常工作,但我不确定在将同一对象编码回 JSON 以发送回服务器时是否有办法反转它。
将 JSON 捕捉为 [String:String] 的字典似乎可以解决问题。
import Foundation
struct ProductData: Codable {
let _id : [String:String]
let productId : String
let description : String
let ...
}
但是,服务器正在努力将其转换回 OrderId() 对象 - 我猜测从 "$id":OrderId("someid") 到 "$id":"someid" 不是应该发生的事情。
我是一个非常新的开发人员(这是我的第一份开发工作)为 creating/processing 订单构建了一个 Swift/iOS 应用程序,并且服务器正在 [= 中向我发送一个 ObjectID() 对象48=] 我查找的每个产品。经过一些研究,这似乎是一个 MongoDB 对象。
编码我的 API 路由的绅士要我为服务器发送给我的每个产品抓取该对象,这样我就可以将它与包含该产品的任何订单一起发送回服务器。他说这将使他在处理新订单时更容易访问产品。
到目前为止,我在解码服务器发送给我的 JSON 时没有遇到任何问题,因为它的格式包括 String、Int、Float 等,或者只是另一种 JSON需要一个充满更多相同结构的新 Codable 结构的对象。
在为 ObjectID 创建 Codable 结构时,我不知道要告诉它什么 keys/value 类型(properties/value 类型,无论您想使用什么术语)。或者如果这甚至是正确的方法。
这是我现在拥有的:
import Foundation
struct ProductData: Codable {
let _id : ObjectId
let productId : String
let description : String
let ...
}
上面出现的 ObjectId 类型是我尚未构建的自定义 Codable 结构,因为我不确定如何构建。我想它应该看起来像这样:
import Foundation
struct ObjectId : Codable {
let someVariableName : SomeCodableType
let ...
}
我不知道变量名或类型是什么。我知道它里面有一个时间戳和一些其他信息,而且我已经读到它被表示为一个字符串,但是如果我在我的产品 Codable 结构中尝试类似 let _id:String
的东西,我会有这种感觉,它不会 decode/encode 我想象的那样。
我想知道如何构建一个 "type" 来正确 catch/decode 向我抛出的 _id 对象。如果有一种方法可以在不解码的情况下简单地保存该数据,并在以后需要时将其发回,那也适合我的目的。
编辑: 经过一些实验,我发现 _id 对象的原始 JSON:
"_id":{"$id":"58071f9d3f791f4f4f8b45ff"}
Swift variable/property 名称中不允许使用美元符号,因此我不确定如何以同时满足传入和传出的方式进行 - 我可以手动制作自定义密钥初始化 JSON 以便它可以与 Swift 一起正常工作,但我不确定在将同一对象编码回 JSON 以发送回服务器时是否有办法反转它。
将 JSON 捕捉为 [String:String] 的字典似乎可以解决问题。
import Foundation
struct ProductData: Codable {
let _id : [String:String]
let productId : String
let description : String
let ...
}
但是,服务器正在努力将其转换回 OrderId() 对象 - 我猜测从 "$id":OrderId("someid") 到 "$id":"someid" 不是应该发生的事情。