Decodable nested data without creating additional class in Swift
up vote
3
down vote
favorite
I'm new in iOS development, so sorry for stupid question in advance.
I have json like this:
"type":"post",
"comments":
"count":0,
"can_post":1
,
"likes":
"count":0,
"user_likes":0,
"can_like":1,
"can_publish":1
,
"reposts":
"count":0,
"user_reposted":0
I want to convert this to class which will contain just likesCount, commentsCount, repostsCount but without creating separate classes for comments
, likes
, reposts
. I'm using Decodable
for this and here is my code which doesn't work :)
Code:
final class FeedItem: Decodable
enum Keys: String, CodingKey
case type,
likes = "likes.count",
comments = "comments.count",
reposts = "reposts.count"
let type: String
var likes = 0
var comments = 0
var reposts = 0
required convenience init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: Keys.self)
let type = try container.decode(String.self, forKey: .type)
let likes = try container.decode(Int.self, forKey: .likes)
let comments = try container.decode(Int.self, forKey: .comments)
let reposts = try container.decode(Int.self, forKey: .reposts)
self.init(type: type, likes: likes, comments: comments, reposts: reposts)
init(type: String,
likes: Int,
comments: Int,
reposts: Int)
self.type = type
self.likes = likes
self.comments = comments
self.reposts = reposts
Error:
"No value associated with key Keys(stringValue: "likes.count", intValue: nil) ("likes.count")."
ios json swift decodable
add a comment |
up vote
3
down vote
favorite
I'm new in iOS development, so sorry for stupid question in advance.
I have json like this:
"type":"post",
"comments":
"count":0,
"can_post":1
,
"likes":
"count":0,
"user_likes":0,
"can_like":1,
"can_publish":1
,
"reposts":
"count":0,
"user_reposted":0
I want to convert this to class which will contain just likesCount, commentsCount, repostsCount but without creating separate classes for comments
, likes
, reposts
. I'm using Decodable
for this and here is my code which doesn't work :)
Code:
final class FeedItem: Decodable
enum Keys: String, CodingKey
case type,
likes = "likes.count",
comments = "comments.count",
reposts = "reposts.count"
let type: String
var likes = 0
var comments = 0
var reposts = 0
required convenience init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: Keys.self)
let type = try container.decode(String.self, forKey: .type)
let likes = try container.decode(Int.self, forKey: .likes)
let comments = try container.decode(Int.self, forKey: .comments)
let reposts = try container.decode(Int.self, forKey: .reposts)
self.init(type: type, likes: likes, comments: comments, reposts: reposts)
init(type: String,
likes: Int,
comments: Int,
reposts: Int)
self.type = type
self.likes = likes
self.comments = comments
self.reposts = reposts
Error:
"No value associated with key Keys(stringValue: "likes.count", intValue: nil) ("likes.count")."
ios json swift decodable
Use traditionalJSONSerialization
. It's less effort (and more efficient) than fightingCodable
– vadian
Nov 10 at 18:19
add a comment |
up vote
3
down vote
favorite
up vote
3
down vote
favorite
I'm new in iOS development, so sorry for stupid question in advance.
I have json like this:
"type":"post",
"comments":
"count":0,
"can_post":1
,
"likes":
"count":0,
"user_likes":0,
"can_like":1,
"can_publish":1
,
"reposts":
"count":0,
"user_reposted":0
I want to convert this to class which will contain just likesCount, commentsCount, repostsCount but without creating separate classes for comments
, likes
, reposts
. I'm using Decodable
for this and here is my code which doesn't work :)
Code:
final class FeedItem: Decodable
enum Keys: String, CodingKey
case type,
likes = "likes.count",
comments = "comments.count",
reposts = "reposts.count"
let type: String
var likes = 0
var comments = 0
var reposts = 0
required convenience init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: Keys.self)
let type = try container.decode(String.self, forKey: .type)
let likes = try container.decode(Int.self, forKey: .likes)
let comments = try container.decode(Int.self, forKey: .comments)
let reposts = try container.decode(Int.self, forKey: .reposts)
self.init(type: type, likes: likes, comments: comments, reposts: reposts)
init(type: String,
likes: Int,
comments: Int,
reposts: Int)
self.type = type
self.likes = likes
self.comments = comments
self.reposts = reposts
Error:
"No value associated with key Keys(stringValue: "likes.count", intValue: nil) ("likes.count")."
ios json swift decodable
I'm new in iOS development, so sorry for stupid question in advance.
I have json like this:
"type":"post",
"comments":
"count":0,
"can_post":1
,
"likes":
"count":0,
"user_likes":0,
"can_like":1,
"can_publish":1
,
"reposts":
"count":0,
"user_reposted":0
I want to convert this to class which will contain just likesCount, commentsCount, repostsCount but without creating separate classes for comments
, likes
, reposts
. I'm using Decodable
for this and here is my code which doesn't work :)
Code:
final class FeedItem: Decodable
enum Keys: String, CodingKey
case type,
likes = "likes.count",
comments = "comments.count",
reposts = "reposts.count"
let type: String
var likes = 0
var comments = 0
var reposts = 0
required convenience init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: Keys.self)
let type = try container.decode(String.self, forKey: .type)
let likes = try container.decode(Int.self, forKey: .likes)
let comments = try container.decode(Int.self, forKey: .comments)
let reposts = try container.decode(Int.self, forKey: .reposts)
self.init(type: type, likes: likes, comments: comments, reposts: reposts)
init(type: String,
likes: Int,
comments: Int,
reposts: Int)
self.type = type
self.likes = likes
self.comments = comments
self.reposts = reposts
Error:
"No value associated with key Keys(stringValue: "likes.count", intValue: nil) ("likes.count")."
ios json swift decodable
ios json swift decodable
edited Nov 10 at 17:53
Dan Loewenherz
6,38133271
6,38133271
asked Nov 10 at 17:29
Magnus Carlsen
183
183
Use traditionalJSONSerialization
. It's less effort (and more efficient) than fightingCodable
– vadian
Nov 10 at 18:19
add a comment |
Use traditionalJSONSerialization
. It's less effort (and more efficient) than fightingCodable
– vadian
Nov 10 at 18:19
Use traditional
JSONSerialization
. It's less effort (and more efficient) than fighting Codable
– vadian
Nov 10 at 18:19
Use traditional
JSONSerialization
. It's less effort (and more efficient) than fighting Codable
– vadian
Nov 10 at 18:19
add a comment |
1 Answer
1
active
oldest
votes
up vote
2
down vote
accepted
The error is very clear, there are no values for associate keys likes.count
as the key not exists.
Use
let container = try decoder.container(keyedBy: CodingKeys.self)
and try container.decodeIfPresent(:_)
to check for key exists or if not assign empty value.
Code:
struct FeedItem: Codable
let type: String
let commentsCount: Int
let canPostComment: Int
let likesCount: Int
let userLikes: Int
let canLike: Int
let canPublish: Int
let repostsCount: Int
let userReposted: Int
enum CodingKeys: String, CodingKey
case type = "type"
case comments = "comments"
case likes = "likes"
case reposts = "reposts"
case count = "count"
case canPost = "can_post"
case userLikes = "user_likes"
case canLike = "can_like"
case canPublish = "can_publish"
case userReposted = "user_reposted"
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
self.type = try container.decodeIfPresent(String.self, forKey: .type) ?? ""
let comments = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
self.commentsCount = try comments.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.canPostComment = try comments.decodeIfPresent(Int.self, forKey: .canPost) ?? 0
let likes = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
self.likesCount = try likes.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userLikes = try likes.decodeIfPresent(Int.self, forKey: .userLikes) ?? 0
self.canLike = try likes.decodeIfPresent(Int.self, forKey: .canLike) ?? 0
self.canPublish = try likes.decodeIfPresent(Int.self, forKey: .canPublish) ?? 0
let reposts = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
self.repostsCount = try reposts.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userReposted = try reposts.decodeIfPresent(Int.self, forKey: .userReposted) ?? 0
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(type, forKey: .type)
var comments = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
try comments.encode(commentsCount, forKey: .count)
try comments.encode(canPostComment, forKey: .canPost)
var likes = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
try likes.encode(likesCount, forKey: .count)
try likes.encode(userLikes, forKey: .userLikes)
try likes.encode(canLike, forKey: .canLike)
try likes.encode(canPublish, forKey: .canPublish)
var reposts = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
try reposts.encode(repostsCount, forKey: .count)
try reposts.encode(userReposted, forKey: .userReposted)
Data Reading:
let data = //Your JSON data from API
let jsonData = try JSONDecoder().decode(FeedItem.self, from: data)
print("(jsonData.type) (jsonData.canLike)")
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
The error is very clear, there are no values for associate keys likes.count
as the key not exists.
Use
let container = try decoder.container(keyedBy: CodingKeys.self)
and try container.decodeIfPresent(:_)
to check for key exists or if not assign empty value.
Code:
struct FeedItem: Codable
let type: String
let commentsCount: Int
let canPostComment: Int
let likesCount: Int
let userLikes: Int
let canLike: Int
let canPublish: Int
let repostsCount: Int
let userReposted: Int
enum CodingKeys: String, CodingKey
case type = "type"
case comments = "comments"
case likes = "likes"
case reposts = "reposts"
case count = "count"
case canPost = "can_post"
case userLikes = "user_likes"
case canLike = "can_like"
case canPublish = "can_publish"
case userReposted = "user_reposted"
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
self.type = try container.decodeIfPresent(String.self, forKey: .type) ?? ""
let comments = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
self.commentsCount = try comments.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.canPostComment = try comments.decodeIfPresent(Int.self, forKey: .canPost) ?? 0
let likes = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
self.likesCount = try likes.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userLikes = try likes.decodeIfPresent(Int.self, forKey: .userLikes) ?? 0
self.canLike = try likes.decodeIfPresent(Int.self, forKey: .canLike) ?? 0
self.canPublish = try likes.decodeIfPresent(Int.self, forKey: .canPublish) ?? 0
let reposts = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
self.repostsCount = try reposts.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userReposted = try reposts.decodeIfPresent(Int.self, forKey: .userReposted) ?? 0
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(type, forKey: .type)
var comments = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
try comments.encode(commentsCount, forKey: .count)
try comments.encode(canPostComment, forKey: .canPost)
var likes = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
try likes.encode(likesCount, forKey: .count)
try likes.encode(userLikes, forKey: .userLikes)
try likes.encode(canLike, forKey: .canLike)
try likes.encode(canPublish, forKey: .canPublish)
var reposts = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
try reposts.encode(repostsCount, forKey: .count)
try reposts.encode(userReposted, forKey: .userReposted)
Data Reading:
let data = //Your JSON data from API
let jsonData = try JSONDecoder().decode(FeedItem.self, from: data)
print("(jsonData.type) (jsonData.canLike)")
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
add a comment |
up vote
2
down vote
accepted
The error is very clear, there are no values for associate keys likes.count
as the key not exists.
Use
let container = try decoder.container(keyedBy: CodingKeys.self)
and try container.decodeIfPresent(:_)
to check for key exists or if not assign empty value.
Code:
struct FeedItem: Codable
let type: String
let commentsCount: Int
let canPostComment: Int
let likesCount: Int
let userLikes: Int
let canLike: Int
let canPublish: Int
let repostsCount: Int
let userReposted: Int
enum CodingKeys: String, CodingKey
case type = "type"
case comments = "comments"
case likes = "likes"
case reposts = "reposts"
case count = "count"
case canPost = "can_post"
case userLikes = "user_likes"
case canLike = "can_like"
case canPublish = "can_publish"
case userReposted = "user_reposted"
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
self.type = try container.decodeIfPresent(String.self, forKey: .type) ?? ""
let comments = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
self.commentsCount = try comments.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.canPostComment = try comments.decodeIfPresent(Int.self, forKey: .canPost) ?? 0
let likes = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
self.likesCount = try likes.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userLikes = try likes.decodeIfPresent(Int.self, forKey: .userLikes) ?? 0
self.canLike = try likes.decodeIfPresent(Int.self, forKey: .canLike) ?? 0
self.canPublish = try likes.decodeIfPresent(Int.self, forKey: .canPublish) ?? 0
let reposts = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
self.repostsCount = try reposts.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userReposted = try reposts.decodeIfPresent(Int.self, forKey: .userReposted) ?? 0
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(type, forKey: .type)
var comments = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
try comments.encode(commentsCount, forKey: .count)
try comments.encode(canPostComment, forKey: .canPost)
var likes = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
try likes.encode(likesCount, forKey: .count)
try likes.encode(userLikes, forKey: .userLikes)
try likes.encode(canLike, forKey: .canLike)
try likes.encode(canPublish, forKey: .canPublish)
var reposts = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
try reposts.encode(repostsCount, forKey: .count)
try reposts.encode(userReposted, forKey: .userReposted)
Data Reading:
let data = //Your JSON data from API
let jsonData = try JSONDecoder().decode(FeedItem.self, from: data)
print("(jsonData.type) (jsonData.canLike)")
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
The error is very clear, there are no values for associate keys likes.count
as the key not exists.
Use
let container = try decoder.container(keyedBy: CodingKeys.self)
and try container.decodeIfPresent(:_)
to check for key exists or if not assign empty value.
Code:
struct FeedItem: Codable
let type: String
let commentsCount: Int
let canPostComment: Int
let likesCount: Int
let userLikes: Int
let canLike: Int
let canPublish: Int
let repostsCount: Int
let userReposted: Int
enum CodingKeys: String, CodingKey
case type = "type"
case comments = "comments"
case likes = "likes"
case reposts = "reposts"
case count = "count"
case canPost = "can_post"
case userLikes = "user_likes"
case canLike = "can_like"
case canPublish = "can_publish"
case userReposted = "user_reposted"
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
self.type = try container.decodeIfPresent(String.self, forKey: .type) ?? ""
let comments = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
self.commentsCount = try comments.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.canPostComment = try comments.decodeIfPresent(Int.self, forKey: .canPost) ?? 0
let likes = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
self.likesCount = try likes.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userLikes = try likes.decodeIfPresent(Int.self, forKey: .userLikes) ?? 0
self.canLike = try likes.decodeIfPresent(Int.self, forKey: .canLike) ?? 0
self.canPublish = try likes.decodeIfPresent(Int.self, forKey: .canPublish) ?? 0
let reposts = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
self.repostsCount = try reposts.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userReposted = try reposts.decodeIfPresent(Int.self, forKey: .userReposted) ?? 0
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(type, forKey: .type)
var comments = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
try comments.encode(commentsCount, forKey: .count)
try comments.encode(canPostComment, forKey: .canPost)
var likes = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
try likes.encode(likesCount, forKey: .count)
try likes.encode(userLikes, forKey: .userLikes)
try likes.encode(canLike, forKey: .canLike)
try likes.encode(canPublish, forKey: .canPublish)
var reposts = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
try reposts.encode(repostsCount, forKey: .count)
try reposts.encode(userReposted, forKey: .userReposted)
Data Reading:
let data = //Your JSON data from API
let jsonData = try JSONDecoder().decode(FeedItem.self, from: data)
print("(jsonData.type) (jsonData.canLike)")
The error is very clear, there are no values for associate keys likes.count
as the key not exists.
Use
let container = try decoder.container(keyedBy: CodingKeys.self)
and try container.decodeIfPresent(:_)
to check for key exists or if not assign empty value.
Code:
struct FeedItem: Codable
let type: String
let commentsCount: Int
let canPostComment: Int
let likesCount: Int
let userLikes: Int
let canLike: Int
let canPublish: Int
let repostsCount: Int
let userReposted: Int
enum CodingKeys: String, CodingKey
case type = "type"
case comments = "comments"
case likes = "likes"
case reposts = "reposts"
case count = "count"
case canPost = "can_post"
case userLikes = "user_likes"
case canLike = "can_like"
case canPublish = "can_publish"
case userReposted = "user_reposted"
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
self.type = try container.decodeIfPresent(String.self, forKey: .type) ?? ""
let comments = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
self.commentsCount = try comments.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.canPostComment = try comments.decodeIfPresent(Int.self, forKey: .canPost) ?? 0
let likes = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
self.likesCount = try likes.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userLikes = try likes.decodeIfPresent(Int.self, forKey: .userLikes) ?? 0
self.canLike = try likes.decodeIfPresent(Int.self, forKey: .canLike) ?? 0
self.canPublish = try likes.decodeIfPresent(Int.self, forKey: .canPublish) ?? 0
let reposts = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
self.repostsCount = try reposts.decodeIfPresent(Int.self, forKey: .count) ?? 0
self.userReposted = try reposts.decodeIfPresent(Int.self, forKey: .userReposted) ?? 0
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(type, forKey: .type)
var comments = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .comments)
try comments.encode(commentsCount, forKey: .count)
try comments.encode(canPostComment, forKey: .canPost)
var likes = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .likes)
try likes.encode(likesCount, forKey: .count)
try likes.encode(userLikes, forKey: .userLikes)
try likes.encode(canLike, forKey: .canLike)
try likes.encode(canPublish, forKey: .canPublish)
var reposts = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .reposts)
try reposts.encode(repostsCount, forKey: .count)
try reposts.encode(userReposted, forKey: .userReposted)
Data Reading:
let data = //Your JSON data from API
let jsonData = try JSONDecoder().decode(FeedItem.self, from: data)
print("(jsonData.type) (jsonData.canLike)")
edited Nov 10 at 18:10
answered Nov 10 at 17:51
Sateesh
1,224615
1,224615
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
add a comment |
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
I've updated my answer. Please have a look into it.
– Sateesh
Nov 10 at 18:11
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
Hi, thanks for you answer, it helped me.
– Magnus Carlsen
Nov 10 at 18:26
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53241576%2fdecodable-nested-data-without-creating-additional-class-in-swift%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Use traditional
JSONSerialization
. It's less effort (and more efficient) than fightingCodable
– vadian
Nov 10 at 18:19