@@ -9,14 +9,19 @@ import Foundation
9
9
10
10
extension AnyJSON {
11
11
/// The decoder instance used for transforming AnyJSON to some Codable type.
12
+ @available (
13
+ * , deprecated, message: " decoder is deprecated, AnyJSON now uses default JSONDecoder(). "
14
+ )
12
15
public static let decoder : JSONDecoder = {
13
16
let decoder = JSONDecoder ( )
14
17
decoder. dataDecodingStrategy = . base64
15
18
decoder. dateDecodingStrategy = . custom { decoder in
16
19
let container = try decoder. singleValueContainer ( )
17
20
let dateString = try container. decode ( String . self)
18
21
19
- let date = ISO8601DateFormatter . iso8601WithFractionalSeconds. value. date ( from: dateString) ?? ISO8601DateFormatter . iso8601. value. date ( from: dateString)
22
+ let date =
23
+ ISO8601DateFormatter . iso8601WithFractionalSeconds. value. date ( from: dateString)
24
+ ?? ISO8601DateFormatter . iso8601. value. date ( from: dateString)
20
25
21
26
guard let decodedDate = date else {
22
27
throw DecodingError . dataCorruptedError (
@@ -30,6 +35,9 @@ extension AnyJSON {
30
35
} ( )
31
36
32
37
/// The encoder instance used for transforming AnyJSON to some Codable type.
38
+ @available (
39
+ * , deprecated, message: " encoder is deprecated, AnyJSON now uses default JSONEncoder(). "
40
+ )
33
41
public static let encoder : JSONEncoder = {
34
42
let encoder = JSONEncoder ( )
35
43
encoder. dataEncodingStrategy = . base64
@@ -47,12 +55,29 @@ extension AnyJSON {
47
55
public init ( _ value: some Codable ) throws {
48
56
if let value = value as? AnyJSON {
49
57
self = value
58
+ } else if let string = value as? String {
59
+ self = . string( string)
60
+ } else if let bool = value as? Bool {
61
+ self = . bool( bool)
62
+ } else if let int = value as? Int {
63
+ self = . integer( int)
64
+ } else if let double = value as? Double {
65
+ self = . double( double)
50
66
} else {
51
- let data = try AnyJSON . encoder . encode ( value)
52
- self = try AnyJSON . decoder . decode ( AnyJSON . self, from: data)
67
+ let data = try JSONEncoder ( ) . encode ( value)
68
+ self = try JSONDecoder ( ) . decode ( AnyJSON . self, from: data)
53
69
}
54
70
}
55
71
72
+ /// Decodes self instance as `Decodable` type.
73
+ public func decode< T: Decodable > ( as type: T . Type = T . self) throws -> T {
74
+ let data = try JSONEncoder ( ) . encode ( self )
75
+ return try JSONDecoder ( ) . decode ( T . self, from: data)
76
+ }
77
+
78
+ @available (
79
+ * , deprecated, renamed: " decode(as:) " , message: " Providing a custom decoder is deprecated. "
80
+ )
56
81
public func decode< T: Decodable > (
57
82
as _: T . Type = T . self,
58
83
decoder: JSONDecoder = AnyJSON . decoder
@@ -63,6 +88,14 @@ extension AnyJSON {
63
88
}
64
89
65
90
extension JSONArray {
91
+ /// Decodes self instance as array of `Decodable` type.
92
+ public func decode< T: Decodable > ( as _: T . Type = T . self) throws -> [ T ] {
93
+ try AnyJSON . array ( self ) . decode ( as: [ T ] . self)
94
+ }
95
+
96
+ @available (
97
+ * , deprecated, renamed: " decode(as:) " , message: " Providing a custom decoder is deprecated. "
98
+ )
66
99
public func decode< T: Decodable > (
67
100
as _: T . Type = T . self,
68
101
decoder: JSONDecoder = AnyJSON . decoder
@@ -72,13 +105,22 @@ extension JSONArray {
72
105
}
73
106
74
107
extension JSONObject {
108
+ /// Decodes self instance as `Decodable` type.
109
+ public func decode< T: Decodable > ( as type: T . Type = T . self) throws -> T {
110
+ try AnyJSON . object ( self ) . decode ( as: type)
111
+ }
112
+
113
+ @available (
114
+ * , deprecated, renamed: " decode(as:) " , message: " Providing a custom decoder is deprecated. "
115
+ )
75
116
public func decode< T: Decodable > (
76
117
as _: T . Type = T . self,
77
118
decoder: JSONDecoder = AnyJSON . decoder
78
119
) throws -> T {
79
120
try AnyJSON . object ( self ) . decode ( as: T . self, decoder: decoder)
80
121
}
81
122
123
+ /// Initialize JSONObject from a `Codable` type
82
124
public init ( _ value: some Codable ) throws {
83
125
guard let object = try AnyJSON ( value) . objectValue else {
84
126
throw DecodingError . typeMismatch (
0 commit comments