【问题标题】:How to parse json objects that have different keys in Swift 3如何在 Swift 3 中解析具有不同键的 json 对象
【发布时间】:2017-08-15 11:58:00
【问题描述】:

嘿,我想知道是否可以解析具有不同键的 json 对象。我一直在寻找,但没有找到解决方案。我遇到的所有内容都有相同的键,但值为 nil 或 null。这是我要解析的 json 文件,它是一个对象数组,但有些对象有不同的键。

{
data: [
  {
    "first_name": "John",
    "middle_name": "Bob",
    "last_name": "Dom"
  },
  {
    "first_name": "Juan",
    "last_name": "Garcia"
  },
  {
    "first_name": "German",
    "middle_name": "Steve",
    "last_name": "Ramirez"
  } 
 ]
}

我正在使用 CoreData。我创建了两个实体,一个名为 Person,另一个名为 PersonWithMiddleName。 Person 有两个属性 firstName 和 lastName。 PersonWithMiddleName 具有中间名,而 Person 是父实体。这有我的数据模型的样子。

这是我用来解析 json 文件的代码。

在人员初始化时,我卡住了。如果 Person 只有名字和姓氏键,我正在尝试初始化它。然后,如果 PersonWithMiddleName 有名字、中间名和姓氏键,我将尝试初始化它们。

所以我想知道是否有一种方法可以检查一个 json 对象,该对象具有数组中其他对象没有的某个键并将其转换为某个类。或者如果没有中间名,数组中的每个对象是否都必须具有相同的键和 nil/null 值。

希望有任何帮助:)

【问题讨论】:

    标签: ios json core-data swift3


    【解决方案1】:

    我不确定我们是否可以搜索密钥,但是通过基本的 if-else 条件,您可以实现这一点。

    if let firstName = personData["FirstName"] {
    
            if let lastName = personData["LastName"] {
    
                if let middleName = personData["middleName"] {
                    let person = PersonWithMiddleName(context: context)
                    person.firstName =
                        person.lastName =
                        person.middleName =
                } else {
                    let person = Person(context: context)
                    person.firstName =
                        person.lastName =
                }
    
            }
    }
    

    【讨论】:

    • 嘿 Bhupesh,我想知道是否有另一种方法来初始化人。我正在网上学习这门课程,讲师做了一些不同的事情。他使用了一些看起来像这样的代码: let person = some condition ? PersonWithMiddleName(上下文:上下文):人(上下文:上下文)]。我试图初始化这样的人。在这种情况下,如果对象有一个中间名键,它会将 person 初始化为 PersonWithMiddleName 否则一个 Person。还是您提供的答案相同。
    • 两者相同。如果您确定 firstName 和 lastName 永远不会为零,那么您可以简单地使用以下语句。如果 middleName 不为零,person 将使用 PersonWithMiddleName 初始化,否则将使用 Person 初始化 person。让人 = middleName.isEmpty ?人(上下文:上下文):PersonWithMiddleName(上下文:上下文)
    • 谢谢你,布佩什
    【解决方案2】:

    这与其他答案基本相同,但我只是从您现有的代码中扩展而来。更改内容见代码注释

    for personData in jsonArray {
    
        //FirstName
        guard let firstName = personData["first_name"] as? String else {
            return
        }
    
        //LastName
        guard let firstName = personData["last_name"] as? String else {
            return
        }
    
        //Fork here to check if there are middle name or not, yes you still can test it as? String even if it nil
        if let middleName = personData["middle_name"] as? String {
            let person = PersonWithMiddleName(context: context)
            person.firstName = firstName
            person.middleName = middleName
            person.lastName = lastName
        } else {
            // Your orignal code on person
            let person = PersonWithMiddleName(context: context)
            person.firstName = firstName
            person.middleName = middleName
            person.lastName = lastName
        }
    }
    

    编辑

    其实是一样的,但是如果你想让风格像你的在线讲师那么也许你想要像

    for personData in jsonArray {
    
        //FirstName
        guard let firstName = personData["first_name"] as? String else {
            return
        }
    
        //LastName
        guard let firstName = personData["last_name"] as? String else {
            return
        }
    
        let middleName = personData["middle_name"] as? String
    
        //Base on your comment, this is what you need?
        let person = middleName == nil ? Person(context: context) : PersonWithMiddleName(context: context)
        person.firstName = firstName
        person.lastName = lastName
    
        // some more check here
        if person is PersonWithMiddleName
        {
            person.middleName = middleName
        }
    }
    

    下面的代码,是另一种分叉形式,如果 middleName == nil,它将选择 Person(context: context) 否则它将选择 PersonWithMiddleName( context: context) 作为 person 变量

    let person = middleName == nil ? Person(context: context) : PersonWithMiddleName(context: context)
    

    【讨论】:

    • Sidhi 这项工作很棒。我想知道是否有另一种初始化人的方法,因为我正在网上学习这门课程,导师做了一些不同的事情。他使用了一些看起来像这样的代码: let person = some condition ? PersonWithMiddleName(上下文:上下文):人(上下文:上下文)]。我试图初始化这样的人。在这种情况下,如果对象有一个中间名键,它会将 person 初始化为 PersonWithMiddleName 否则一个 Person。还是您提供的答案相同。
    • 嗨@LuisRamirez,基本相同,请查看我的编辑以获取更多信息
    • 谢谢你,Sidhi 的帮助 :)
    【解决方案3】:

    你可以使用 SwiftyJSON 来做,简单又简单

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多