Skip to content

Commit 61c74d5

Browse files
fix: Flatten json recursively
1 parent 0d2712c commit 61c74d5

File tree

1 file changed

+22
-60
lines changed

1 file changed

+22
-60
lines changed

Sources/Confidence/ConfidenceValue.swift

Lines changed: 22 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -211,75 +211,37 @@ extension ConfidenceValue {
211211
}
212212

213213
extension ConfidenceValue {
214-
// swiftlint:disable function_body_length
215214
// swiftlint:disable cyclomatic_complexity
216215
// swiftlint:disable identifier_name
217216
public func asJSONData() -> Data? {
218-
let encoder = JSONEncoder()
219-
encoder.outputFormatting = .sortedKeys
220-
221-
switch value {
222-
case .boolean(let value):
223-
return try? encoder.encode(value)
224-
case .string(let value):
225-
return try? encoder.encode(value)
226-
case .integer(let value):
227-
return try? encoder.encode(value)
228-
case .double(let value):
229-
return try? encoder.encode(value)
230-
case .date(let value):
231-
return try? encoder.encode(value)
232-
case .timestamp(let value):
233-
return try? encoder.encode(value)
234-
case .structure(let values):
235-
var flattened: [String: Any] = [:]
236-
for (key, value) in values {
237-
switch value {
238-
case .boolean(let v): flattened[key] = v
239-
case .string(let v): flattened[key] = v
240-
case .integer(let v): flattened[key] = v
241-
case .double(let v): flattened[key] = v
242-
case .date(let v): flattened[key] = v
243-
case .timestamp(let v): flattened[key] = v
244-
case .structure(let v):
245-
var nested: [String: Any] = [:]
246-
for (nestedKey, nestedValue) in v {
247-
switch nestedValue {
248-
case .boolean(let v): nested[nestedKey] = v
249-
case .string(let v): nested[nestedKey] = v
250-
case .integer(let v): nested[nestedKey] = v
251-
case .double(let v): nested[nestedKey] = v
252-
case .date(let v): nested[nestedKey] = v
253-
case .timestamp(let v): nested[nestedKey] = v
254-
case .structure(let v):
255-
var innerNested: [String: Any] = [:]
256-
for (innerKey, innerValue) in v {
257-
switch innerValue {
258-
case .boolean(let v): innerNested[innerKey] = v
259-
case .string(let v): innerNested[innerKey] = v
260-
case .integer(let v): innerNested[innerKey] = v
261-
case .double(let v): innerNested[innerKey] = v
262-
case .date(let v): innerNested[innerKey] = v
263-
case .timestamp(let v): innerNested[innerKey] = v
264-
default: break
265-
}
266-
}
267-
nested[nestedKey] = innerNested
268-
default: break
269-
}
217+
func flatten(_ value: ConfidenceValueInternal) -> Any? {
218+
switch value {
219+
case .boolean(let v): return v
220+
case .string(let v): return v
221+
case .integer(let v): return v
222+
case .double(let v): return v
223+
case .date(let v): return v
224+
case .timestamp(let v): return v
225+
case .list(let values):
226+
return values.compactMap { flatten($0) }
227+
case .structure(let values):
228+
var dict: [String: Any] = [:]
229+
for (key, val) in values {
230+
if let flattened = flatten(val) {
231+
dict[key] = flattened
270232
}
271-
flattened[key] = nested
272-
default: break
273233
}
234+
return dict
235+
case .null:
236+
return NSNull()
274237
}
238+
}
239+
240+
if let flattened = flatten(self.value) {
275241
return try? JSONSerialization.data(withJSONObject: flattened, options: .sortedKeys)
276-
case .null:
277-
return try? JSONSerialization.data(withJSONObject: NSNull())
278-
default:
279-
return nil
280242
}
243+
return nil
281244
}
282-
// swiftlint:enable function_body_length
283245
// swiftlint:enable cyclomatic_complexity
284246
// swiftlint:enable identifier_name
285247
}

0 commit comments

Comments
 (0)