Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 23 additions & 8 deletions Source/SwiftyJSON/SwiftyJSON.swift
Original file line number Diff line number Diff line change
Expand Up @@ -285,26 +285,39 @@ public struct JSON {

/// Private method for resolving raw json object's content and error
private func resolveContentAndError(for jsonObject: Any) -> (Content, SwiftyJSONError?) {
let content = resolveContent(for: jsonObject)
let error: SwiftyJSONError? = (content == .unknown) ? .unsupportedType : nil
return (content, error)
do {
let content = try resolveContent(for: jsonObject)
let error: SwiftyJSONError? = (content == .unknown) ? .unsupportedType : nil

return (content, error)
} catch let error as SwiftyJSONError {
return (.unknown, error)
} catch {
return (.unknown, .unsupportedType)
}
}

/// Private method for resolving raw json object's content
private func resolveContent(for jsonObject: Any) -> Content {
private func resolveContent(for jsonObject: Any) throws -> Content {
switch jsonObject {
case let json as JSON:
return json.content
case let content as Content:
return content
case let dictionary as [String: Any]:
return .dictionary(dictionary.mapValues(resolveContent))
return .dictionary(try dictionary.mapValues(resolveContent))
case let array as [Any]:
return .array(array.map(resolveContent))
return .array(try array.map(resolveContent))
case let string as String:
return .string(string)
case let number as NSNumber:
return number.isBool ? .bool(number.boolValue) : .number(number)
case let data as Data:
do {
return try JSON(data: data).content
} catch {
throw SwiftyJSONError.invalidJSON
}
case nil:
return .null
case is NSNull:
Expand Down Expand Up @@ -763,7 +776,8 @@ extension JSON {
}
set {
if let newValue = newValue {
update(content: .array(newValue.map(resolveContent)), error: nil)
let (content, error) = resolveContentAndError(for: newValue)
update(content: content, error: error)
} else {
update(content: .null, error: nil)
}
Expand Down Expand Up @@ -795,7 +809,8 @@ extension JSON {
}
set {
if let newValue = newValue {
update(content: .dictionary(newValue.mapValues(resolveContent)), error: nil)
let (content, error) = resolveContentAndError(for: newValue)
update(content: content, error: error)
} else {
update(content: .null, error: nil)
}
Expand Down
14 changes: 14 additions & 0 deletions Tests/SwiftJSONTests/BaseTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -284,4 +284,18 @@ class BaseTests: XCTestCase {
XCTAssertEqual(JSON(nonNilOptionalString as Any).type, .string)
XCTAssertEqual(JSON(nonNilOptionalTestCase as Any).type, .unknown)
}

func testNestedDataResolving() {
let json = JSON([
"root": #"{"foo": "bar"}"#.data(using: .utf8)!
])

XCTAssertEqual(json["root"]["foo"].string, "bar")

let invalidJson = JSON([
"root": #"baz"#.data(using: .utf8)!
])

XCTAssertEqual(invalidJson.error, .invalidJSON)
}
}