我是 iOS 开发的新手,很抱歉提前提出愚蠢的问题。 我有这样的 json:
{
"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
}
}
我想将其转换为仅包含 likesCount、commentsCount、repostsCount 的类,但不为 comments、likes、reposts 创建单独的类>。我正在为此使用 Decodable,这是我的代码,它不起作用:)
代码:
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
}
}
错误:
"No value associated with key Keys(stringValue: \"likes.count\", intValue: nil) (\"likes.count\")."
最佳答案
错误很明显,关联键 likes.count 没有值,因为键不存在。
使用
let container = try decoder.container(keyedBy: CodingKeys.self)
并尝试 container.decodeIfPresent(:_) 检查键是否存在,如果不存在则分配空值。
代码:
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)
}
}
数据读取:
let data = //Your JSON data from API
let jsonData = try JSONDecoder().decode(FeedItem.self, from: data)
print("\(jsonData.type) \(jsonData.canLike)")
关于ios - 无需在 Swift 中创建附加类即可解码嵌套数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53241576/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送