JsonSwiftson 3.0.2

JsonSwiftson 3.0.2

测试测试
语言语言 SwiftSwift
许可 MIT
发布上次发布2016年6月
SPM支持 SPM

Evgenii Neumerzhitckii 维护。




  • Evgenii Neumerzhitckii

为 iOS, macOS, tvOS 和 watchOS 编写的具有简洁 API 的 SwiftJSON 解析器

JsonSwiftson 是一个 JSON 解析器,它仅公开了一个 API 方法 map(),用于将 JSON 属性映射到 Swift 类型。

JsonSwiftson JSON parser for Swift

  • 将 JSON 文本映射到 Swift 结构体或类。
  • 通过使用 Swift 泛型和利用语言的类型转换功能来保持库 源代码 小型化。
  • 支持可选类型的转换。
  • 指示映射操作是否成功。
  • 确保映射操作快速。

示例

以下是将 JSON 文本映射到一个 Swift Person 结构体的示例。

struct Person {
  let name: String
  let age: Int
}

let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")

let person = Person(
  name: mapper["name"].map() ?? "",
  age: mapper["age"].map() ?? 0
)

if !mapper.ok { /* report error */ }

设置

您可以将 JsonSwiftson 添加到项目中三种方式之一。

添加源文件 (iOS 7+)

只需将 JsonSwiftson.swift 文件添加到您的 Xcode 项目中。

使用 Swift Package Manager 设置

将以下文本添加到您的 Package.swift 并运行 swift build

import PackageDescription

let package = Package(
    name: "YourPackageName",
    targets: [],
    dependencies: [
        .Package(url: "https://github.com/evgenyneu/JsonSwiftson.git",
                 versions: Version(3,0,0)..<Version(4,0,0))
    ]
)

遗留 Swift 版本

如果您使用的是较旧的 Swift 版本,请设置库的 早期版本

用法

1) 如果您使用了 Carthage 或 CocoaPods 设置,请将 import JsonSwiftson 添加到源代码中。

2) 创建一个 JsonSwiftson 类的实例并提供一个 JSON 文本用于解析。

let mapper = JsonSwiftson(json: "{ \"person\": { \"name\": \"Michael\" }}")

3) 提供您想要获取的 JSON 属性名,并调用 map 方法。JSON 值的类型从上下文推断。

let name: String? = mapper["person"]["name"].map()

上述示例将 JSON 映射到了可选 String 类型。可以使用 ?? 运算符和非可选映射并提供了默认值。

let name: String = mapper["person"]["name"].map() ?? "Default name"

4) 最后,检查ok属性以判断映射是否成功。

if !mapper.ok { /* report error */ }

如果JSON解析失败或缺少给定名称的属性,则ok属性将返回false。您可以通过向map方法传入optional: true参数来允许属性缺失。

let name: String? = mapper["person"]["name"].map(optional: true)

映射到简单的Swift类型

使用map方法将JSON解析为字符串、数字和布尔值等类型。

// String
let stringMapper = JsonSwiftson(json: "\"Hello World\"")
let string: String? = stringMapper.map()

// Integer
let intMapper = JsonSwiftson(json: "123")
let int: Int? = intMapper.map()

// Double
let doubleMapper = JsonSwiftson(json: "123.456")
let double: Double? = doubleMapper.map()

// Boolean
let boolMapper = JsonSwiftson(json: "true")
let bool: Bool? = boolMapper.map()

按名称映射属性

使用方括号通过名称访问JSON属性:mapper["name"]

let mapper = JsonSwiftson(json: "{ \"name\": \"Michael\" }")
let name: String? = mapper["name"].map()

可以通过多次使用方括号来访问更深层的JSON属性:mapper["person"]["name"]

let mapper = JsonSwiftson(json: "{ \"person\": { \"name\": \"Michael\" }}")
let name: String? = mapper["person"]["name"].map()

映射简单值的数组

JsonSwiftson会自动将值映射到字符串、数字和布尔值的数组。

// String
let stringMapper = JsonSwiftson(json: "[\"One\", \"Two\"]")
let string: [String]? = stringMapper.map()

// Integer
let intMapper = JsonSwiftson(json: "[1, 2]")
let int: [Int]? = intMapper.map()

// Double
let doubleMapper = JsonSwiftson(json: "[1.1, 2.2]")
let double: [Double]? = doubleMapper.map()

// Boolean
let boolMapper = JsonSwiftson(json: "[true, false]")
let bool: [Bool]? = boolMapper.map()

映射对象数组

使用mapArrayOfObjects方法与闭包一起映射对象数组。

struct Person {
  let name: String
  let age: Int
}

let mapper = JsonSwiftson(json:
  "[ " +
    "{ \"name\": \"Peter\", \"age\": 41 }," +
    "{ \"name\": \"Ted\", \"age\": 51 }" +
  "]")

let people: [Person]? = mapper.mapArrayOfObjects { j in
  Person(
    name: j["name"].map() ?? "",
    age: j["age"].map() ?? 0
  )
}

提示:对于字符串、数字和布尔值等简单值的数组,使用map方法而不是mapArrayOfObjects

映射到Swift结构体

struct Person {
  let name: String
  let age: Int
}

let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }")

let person = Person(
  name: mapper["name"].map() ?? "",
  age: mapper["age"].map() ?? 0
)

检查映射是否成功

验证ok属性以查看映射是否成功。如果JSON不正确或存在类型转换问题,映射将失败。

注意mapmapArrayOfObjects方法在映射失败时始终返回nil

let successMapper = JsonSwiftson(json: "\"Correct type\"")
let string: String? = successMapper.map()
if successMapper.ok { print("👏👏👏") }

let failMapper = JsonSwiftson(json: "\"Wrong type\"")
let number: Int? = failMapper.map()
if !failMapper.ok { print("🐞") }

允许缺失值

如果JSON值为null或属性缺失,则默认映射失败。

提示:传入optional: true参数以允许缺失的JSON属性和null值。

let mapper = JsonSwiftson(json: "{ }")
let string: String? = mapper["name"].map(optional: true)
if mapper.ok { print("👏👏👏") }

允许缺少对象

使用map方法与optional: true参数和一个闭包来允许空对象。

struct Person {
  let name: String
  let age: Int
}

let mapper = JsonSwiftson(json: "null") // empty

let person: Person? = mapper.map(optional: true) { j in
  Person(
    name: j["name"].map() ?? "",
    age: j["age"].map() ?? 0
  )
}

if mapper.ok { print("👏👏👏") }

提示:映射到非可选类型

如果您需要映射到类似于let number: Int的非可选类型,在mapper后面使用??运算符。

let numberMapper = JsonSwiftson(json: "123")
let number: Int = numberMapper.map() ?? 0

let arrayMapper = JsonSwiftson(json: "[1, 2, 3]")
let numbers: [Int] = arrayMapper.map() ?? []

性能基准测试

本项目包括一个运行性能基准测试的演示应用程序。该程序映射包含100个记录的大型JSON文件。该过程重复100次。

Json Swiftson performance benchmark

替代解决方案

以下是一些出色的库列表,可以帮助您在Swift中控制JSON。

许可

JsonSwiftson遵循MIT许可