我正在尝试从JSON获取值并将其附加到titleArray
。
func updateUI() {
DispatchQueue.global(qos: .background).async {
// network call to the API
self.fetchTipsJson(completion: { (res) in
switch res {
case .success(let tips):
self.titleArray.append(tips.responseList!.values[title]) // Cannot subscript a value of type '[Value]' with an index of type 'String?'
print(self.titleArray)
case .failure(let err):
print("Failed to fetch tips:", err)
}
})
DispatchQueue.main.async {
// Update the UI Label here
}
}
}
我得到一个错误,但是我不认为这是应该做的。
JSON:
{
"$type": "DTOMapper.DTOResponseList`1[[Telemed.Dto.DTOTip, Telemed.Dto]], DTOMapper",
"ResponseList": {
"$type": "System.Collections.Generic.List`1[[Telemed.Dto.DTOTip, Telemed.Dto]], mscorlib",
"$values": [
{
"$type": "Telemed.Dto.DTOTip, Telemed.Dto",
"Title": "NO TE JUNTES CON LUQUITAS",
"Text": "Porque si tenes un amigo lucas y otro amigo lucas, tenés dos lucas. Pero no te sirven para pagar nada",
"GroupName": "TGC.Tips1",
"ConfigurationPath": "TelemedGlobalConfig>Tips>Tips[0]"
},
{
"$type": "Telemed.Dto.DTOTip, Telemed.Dto",
"Title": "no te emborraches en las fiestas",
"Text": "Terminarás pateando globos",
"GroupName": "TGC.Tips2",
"ConfigurationPath": "TelemedGlobalConfig>Tips>Tips[1]"
}
]
},
"StatusCode": 200,
"ErrorId": 0
}
我可以正确访问$values
吗?如果有帮助,titleArray
将与UILabel一起使用。
编辑updateLabels()
:
func updateLabels() {
self.myTimer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { (t) in
self.titleLabel.text = self.titleArray[self.counter] as? String
self.textLabel.text = self.textArray[self.counter] as? String
self.counter += 1
if self.counter == self.titleArray.count && self.counter == self.textArray.count{
t.invalidate()
}
}
}
编辑回调:
do {
let tips = try JSONDecoder().decode(Root.self, from: data!)
self.titleArray = tips.responseList!.values.map { $0.title }
self.textArray = tips.responseList!.values.map { $0.text }
DispatchQueue.main.async {
self.updateLabels()
}
completion(.success(tips))
} catch let jsonError {
completion(.failure(jsonError))
}
编辑viewDidLoad()
:
override func viewDidLoad() {
super.viewDidLoad()
fetchTipsJson { (res) in
switch res {
case .success:
return
case .failure(let err):
print("Failed to fetch tips:", err)
}
}
}
答案 0 :(得分:0)
values
是一个数组,而不是字典,您需要将其映射到title
字符串,因此请尝试
let str = """
{
"$type": "DTOMapper.DTOResponseList`1[[Telemed.Dto.DTOTip, Telemed.Dto]], DTOMapper",
"ResponseList": {
"$type": "System.Collections.Generic.List`1[[Telemed.Dto.DTOTip, Telemed.Dto]], mscorlib",
"$values": [
{
"$type": "Telemed.Dto.DTOTip, Telemed.Dto",
"Title": "NO TE JUNTES CON LUQUITAS",
"Text": "Porque si tenes un amigo lucas y otro amigo lucas, tenés dos lucas. Pero no te sirven para pagar nada",
"GroupName": "TGC.Tips1",
"ConfigurationPath": "TelemedGlobalConfig>Tips>Tips[0]"
},
{
"$type": "Telemed.Dto.DTOTip, Telemed.Dto",
"Title": "no te emborraches en las fiestas",
"Text": "Terminarás pateando globos",
"GroupName": "TGC.Tips2",
"ConfigurationPath": "TelemedGlobalConfig>Tips>Tips[1]"
}
]
},
"StatusCode": 200,
"ErrorId": 0
}
"""
do {
let res = try JSONDecoder().decode(Root.self, from: Data(str.utf8))
let arr = res.responseList.values.map { $0.title }
print(arr)
}
catch {
print(error)
}
}
// MARK: - Empty
struct Root: Codable {
let type: String
let responseList: ResponseList
let statusCode, errorID: Int
enum CodingKeys: String, CodingKey {
case type = "$type"
case responseList = "ResponseList"
case statusCode = "StatusCode"
case errorID = "ErrorId"
}
}
// MARK: - ResponseList
struct ResponseList: Codable {
let type: String
let values: [Value]
enum CodingKeys: String, CodingKey {
case type = "$type"
case values = "$values"
}
}
// MARK: - Value
struct Value: Codable {
let type, title, text, groupName: String
let configurationPath: String
enum CodingKeys: String, CodingKey {
case type = "$type"
case title = "Title"
case text = "Text"
case groupName = "GroupName"
case configurationPath = "ConfigurationPath"
}
}
编辑:
var counter = 0
var myTimer:Timer!
self.myTimer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { (t) in
self.lbl.text = self.titleArr[self.counter]
counter += 1
if self.counter == self.titleArr.count {
t.invalidate()
}
}
答案 1 :(得分:0)
第一件事tips.responseList!.values
是Array
而不是Dictionary
。所以你不能喜欢
self.titleArray.append(tips.responseList!.values[title])
您可以通过迭代数组中的所有元素来做到这一点。
self.titleArray.append(contentsOf:tips.responseList!.values.compactMap { $0.title })
请忽略语法错误,因为这是一个正确的主意。