检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)

Posted

技术标签:

【中文标题】检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)【英文标题】:Check if value is present in JSON array, if not check next array(Swift / SwiftUI)检查 JSON 数组中是否存在值,如果不存在则检查下一个数组(Swift / SwiftUI) 【发布时间】:2021-06-03 17:36:25 【问题描述】:

我有用户名和密码,我需要根据 JSON 文件中的数据检查这两项,如果两者都正确/存在,我会返回一个包含“项目”中数据的列表。

例如:如果我输入“user”作为用户名并输入“pass”作为密码,视图应该在列表中显示“Dog, Cat, Mouse, Parrot, Goldfish”。

如果我的语法不正确,可以修改 JSON 文件。

JSON:

[
    
        "username": "user",
        "password": "pass",
        "type": "Animals",
        "items": ["Dog",
                    "Cat",
                    "Mouse",
                    "Parrot",
                    "Goldfish"
        ]
    ,
    
        "username": "helloworld",
        "password": "firstprogram",
        "type": "States",
        "items": ["Not Running",
                    "Inactive",
                    "Active",
                    "Background",
                    "Suspended"
        ]
    ,
    
        "username": "movielover",
        "password": "bestmovies",
        "type": "Movies",
        "items": ["Kill Bill",
                    "Us",
                    "Parasite",
                    "Coco",
                    "Inception"
        ]
    ,
]

Swift UI 代码:

import SwiftUI

struct LoginView: View 

    var userName = "user"
    
    var items: UserModel = UserModelData().userInformation[0]//this only displays data 
for the first item in the array, I would like to check each item,find the one 
that contains userName, and use that index.
    
    var body: some View
        VStack
           
            Text("\(items.username)'s \(items.type)")
                .font(.title)
                .fontWeight(.bold)
            
            if userName == items.username
                    Form
                        List(items.items, id: \.self) item in
                            Text(item)
                        
                    
            
            
            
        
    


struct LoginView_Previews: PreviewProvider 
    static var previews: some View 
        LoginView()
    


【问题讨论】:

【参考方案1】:

您可以使用first(where:) 在数组中查找与给定条件匹配的项目(在这种情况下,用户名匹配)。它返回一个可选的,因为不能保证会有匹配的项目。

我不得不删除 UserModelUserModelData,因为您没有包含它们,因此您需要确保类型名称与您的名称匹配。

struct UserModel 
    var username : String
    var password : String
    var items : [String]
    var type: String


struct UserModelData 
    var userInformation : [UserModel] = []


struct LoginView: View 
    
    var userName = "user"
    
    private var userModelData = UserModelData()
    
    var userInformation : UserModel? 
        userModelData.userInformation.first  $0.username == userName 
    
    
    var body: some View
        VStack 
            
            if let userInformation = userInformation 
                Text("\(userInformation.username)'s \(userInformation.type)")
                    .font(.title)
                    .fontWeight(.bold)
                
                Form 
                    List(userInformation.items, id: \.self)  item in
                        Text(item)
                    
                
            
            
        
    

【讨论】:

【参考方案2】:

您可以使用过滤器实现此目的:

var item: UserModel = UserModelData().userInformation.filter( $0.username == "user" && $0.password == "pass" ).first

此外,您可以将此逻辑移至 UserModelData 并执行以下操作:

var serModelData = UserModelData()
lazy var item: UserModel = userModelData.retrieveUserModel(for: "user", and: "pass")

地点:

class UserModelData 
    ...
    func retrieveUserModel(for username: String, and password: String) 
        userInformation
            .filter( $0.username == username && $0.password == password ).first
    


【讨论】:

以上是关于检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)的主要内容,如果未能解决你的问题,请参考以下文章

检查 JSON 关联数组中是不是存在值

检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组

如何检查json数据数组是不是返回值

Flutter检查json显示/隐藏容器中是不是存在值

检查 JSON 文件中是不是存在数组 - iOS

检查值是不是存在的数组列表,如果存在则将 1 添加到字符串