我如何从 JSON 响应中获取字典的第二个值数组,在 Swift 中
How do i get array of dictionary's 2nd value from JSON response, in Swift
这是我在邮递员中的JSON回复:
{
"result": {
"reviewcat": [
{
"id": 5
},
{
"id": 6
},
{
"id": 7
}
],
"reviewDet": {
"review_details": [
{
"review_point": "2.0"
},
{
"review_point": "4.5"
},
{
"review_point": "3",
}
],
对于以上回复,我创建了如下模型
public class BuyerReviewModel {
public var result : BuyserReviewResult?
}
public class BuyserReviewResult {
public var reviewcat : Array<Reviewcat>?
public var reviewDet : ReviewDet?
}
public class Reviewcat {
public var review_name : String?
public var id : Int?
}
public class ReviewDet {
public var review_details : Array<Review_details>?
}
public class Review_details {
public var review_cat_id : Int?
public var review_point : Float?
}
代码: 使用此代码我只获得第一次审核 review_point
val 2.5...我如何获得第二次 review_point value 4.5
怎么办?有人指导我
class PostReviewVC: UIViewController {
@IBOutlet var rateImageViews: [UIImageView]!// 5 images array
@IBOutlet var rateButtons: [UIButton]!// 5 buttons array
var rateFatched: Float = 0.0
private var testData = ReviewModel(dictionary: NSDictionary()){
didSet{
titleLbl.text = byuReviewData?.result?.enquiry?.comments
idLbl.text = byuReviewData?.result?.enquiry?.ref_no
userNameLbl.text = "\(byuReviewData?.result?.reviewDet?.get_to_user?.first_name ?? "") \(byuReviewData?.result?.reviewDet?.get_to_user?.last_name ?? "")"
if let data = testData?.result?.reviewDet{
for buyReviewData in data.review_details ?? []{
rateFatched = buyReviewData.review_point ?? 0.0
if rateFatched == NSString("2.5").floatValue{
for button in rateButtons {
if button.tag >= 2 {
allImages[button.tag].image = (#imageLiteral(resourceName: "staremp"))
}
else {
allImages[button.tag].image = (#imageLiteral(resourceName: "star"))
}
}
}
}
}
}
}
}
是的,review_point
是 String
类型而不是 Float
,正如 @burnsi
所建议的
获取字符串值后,您可以随时 parse
将其设置为 Float
因为这里的主要问题似乎是如何让正确的数据显示在这里是专注于此但忽略任何 UI 相关内容的解决方案,因为我认为它 off-topic.
我对结构做了一些更改,但没什么大不了的,从 class 更改为 struct,删除了一些没有意义的可选值,并从 var 更改为 let,但可以随意将其更改回来,因为它对答案来说并不重要。
public struct BuyserReviewResult {
public let reviewcat : [Reviewcat]
public let reviewDet : ReviewDet?
}
public struct Reviewcat {
public let review_name : String
public let id : Int
}
public struct ReviewDet {
public let review_details : [Review_details]
}
public struct Review_details {
public let review_cat_id : Int
public let review_point : Float
}
现在你可以通过
简单地获取每个类别的名称和该类别的分数
for category in result.reviewcat {
let points = result.reviewDet?.review_details
.first(where: { [=11=].review_cat_id == category.id })?.review_point ?? 0.0
print(category.review_name, points)
}
请注意,这里也忽略了顶级类型,因为一旦您解析了数据就不再需要它。
这是我在邮递员中的JSON回复:
{
"result": {
"reviewcat": [
{
"id": 5
},
{
"id": 6
},
{
"id": 7
}
],
"reviewDet": {
"review_details": [
{
"review_point": "2.0"
},
{
"review_point": "4.5"
},
{
"review_point": "3",
}
],
对于以上回复,我创建了如下模型
public class BuyerReviewModel {
public var result : BuyserReviewResult?
}
public class BuyserReviewResult {
public var reviewcat : Array<Reviewcat>?
public var reviewDet : ReviewDet?
}
public class Reviewcat {
public var review_name : String?
public var id : Int?
}
public class ReviewDet {
public var review_details : Array<Review_details>?
}
public class Review_details {
public var review_cat_id : Int?
public var review_point : Float?
}
代码: 使用此代码我只获得第一次审核 review_point
val 2.5...我如何获得第二次 review_point value 4.5
怎么办?有人指导我
class PostReviewVC: UIViewController {
@IBOutlet var rateImageViews: [UIImageView]!// 5 images array
@IBOutlet var rateButtons: [UIButton]!// 5 buttons array
var rateFatched: Float = 0.0
private var testData = ReviewModel(dictionary: NSDictionary()){
didSet{
titleLbl.text = byuReviewData?.result?.enquiry?.comments
idLbl.text = byuReviewData?.result?.enquiry?.ref_no
userNameLbl.text = "\(byuReviewData?.result?.reviewDet?.get_to_user?.first_name ?? "") \(byuReviewData?.result?.reviewDet?.get_to_user?.last_name ?? "")"
if let data = testData?.result?.reviewDet{
for buyReviewData in data.review_details ?? []{
rateFatched = buyReviewData.review_point ?? 0.0
if rateFatched == NSString("2.5").floatValue{
for button in rateButtons {
if button.tag >= 2 {
allImages[button.tag].image = (#imageLiteral(resourceName: "staremp"))
}
else {
allImages[button.tag].image = (#imageLiteral(resourceName: "star"))
}
}
}
}
}
}
}
}
是的,review_point
是 String
类型而不是 Float
,正如 @burnsi
获取字符串值后,您可以随时 parse
将其设置为 Float
因为这里的主要问题似乎是如何让正确的数据显示在这里是专注于此但忽略任何 UI 相关内容的解决方案,因为我认为它 off-topic.
我对结构做了一些更改,但没什么大不了的,从 class 更改为 struct,删除了一些没有意义的可选值,并从 var 更改为 let,但可以随意将其更改回来,因为它对答案来说并不重要。
public struct BuyserReviewResult {
public let reviewcat : [Reviewcat]
public let reviewDet : ReviewDet?
}
public struct Reviewcat {
public let review_name : String
public let id : Int
}
public struct ReviewDet {
public let review_details : [Review_details]
}
public struct Review_details {
public let review_cat_id : Int
public let review_point : Float
}
现在你可以通过
简单地获取每个类别的名称和该类别的分数for category in result.reviewcat {
let points = result.reviewDet?.review_details
.first(where: { [=11=].review_cat_id == category.id })?.review_point ?? 0.0
print(category.review_name, points)
}
请注意,这里也忽略了顶级类型,因为一旦您解析了数据就不再需要它。