【问题标题】:Convert JSON to array of property options将 JSON 转换为属性选项数组
【发布时间】:2018-01-16 11:16:19
【问题描述】:

我有一个 JSON 文件:

{
  "sceneSettings":[
    {
      "showsStatistics":false,
      "autoenablesDefaultLighting":false,
      "antialiasingMode":"multisampling4X",
      "debugOptions":[
        {
          "showPhysicsShapes":false,
          "showBoundingBoxes":false,
          "showLightInfluences":false,
          "showLightExtents":false,
          "showPhysicsFields":false,
          "showWireframe":false,
          "renderAsWireframe":false,
          "showSkeletons":false,
          "showCreases":false,
          "showConstraints":false,
          "showCameras":false
        }
      ]
    }
  ]
}

我想获取 debugOptions 并将它们作为 SCNDebugOptions 的数组返回以在 ARkit 中使用。

我目前有一个结构 DebugOption:

struct DebugOption: Decodable, Loopable {
    let showPhysicsShapes: Bool = false
    let showBoundingBoxes: Bool  = false
    let showLightInfluences: Bool = false
    let showLightExtents: Bool = false
    let showPhysicsFields: Bool = false
    let showWireframe: Bool = false
    let renderAsWireframe: Bool = false
    let showSkeletons: Bool = false
    let showCreases: Bool = false
    let showConstraints: Bool = false
    let showCameras: Bool = false
}

我使用以下方法解码 json 文件:

class SceneSettingsFactory {

    func parseJSON() -> SceneSettings? {
        if let url = Bundle.main.url(forResource: "ModelsData", withExtension: "json") {
            do {
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let jsonData = try decoder.decode(ResponseData.self, from: data)

                return jsonData.sceneSettings
            } catch {
                print("error:\(error)")
            }
        }
        return nil
    }
}

struct ResponseData: Decodable {
    var model: [Model]
    var sceneSettings: SceneSettings
}

struct SceneSettings: Decodable {
    let showsStatistics: Bool = false
    let autoenablesDefaultLighting: Bool = false
    let antialiasingMode: AntialiasingOption = .none
    let debugOptions: DebugOption
}

如果 Bool 值为 true,我不确定如何有效地将 Bool 值转换为对应的 SCNDebugOptions 数组。

我首先将以下内容添加到我的 DebugOption 结构中,但感觉不是最好的方法。

func getOptionArray() -> [SCNDebugOptions] {
    var optionsArray = [SCNDebugOptions]()
    let allPropertyValues = self.allProperties
    allPropertyValues.forEach { property in
        guard let valueIsTrue = property.value as? Bool else { return }
        let propertyAsOption = keyStringAsOption(property.key)
        if valueIsTrue {
            optionsArray.append(propertyAsOption)
        }
    }
}

private func keyStringAsOption(_ propertyString: String) -> SCNDebugOptions {
    switch propertyString {
        case ""
    }
}

任何见解或帮助都会很棒,因为这感觉很冗长。

【问题讨论】:

    标签: json swift swift4


    【解决方案1】:
    struct ResponseData: Decodable {
        var model: [Model]
        var sceneSettings: SceneSettings
    }
    

    看起来错了。您的 sceneSettings 是数组,但您的类型是 SceneSettings。我建议你创建这样的东西:

    struct ResponseData: Decodable {
        var model: [Model]
        var sceneSettings: [SceneSetting]
    }
    

    您还应该将SceneSettings 结构更新为SceneSetting

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多