Skip to content

Commit 88d8587

Browse files
committed
fixed issue 39
1 parent 331c815 commit 88d8587

File tree

16 files changed

+532
-24
lines changed

16 files changed

+532
-24
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
---
44

5+
## [1.1.2](https://github.com/kakaopensource/KakaJSON/releases/tag/1.1.2) (2019-12-23)
6+
- Supporting convert from [String: [[String: Any]]] to [String: [Model]]
7+
- Supporting 'enum array', 'enum dict'
8+
- Closed issues
9+
- [嵌套解析出错](https://github.com/kakaopensource/KakaJSON/issues/39)
10+
511
## [1.1.1](https://github.com/kakaopensource/KakaJSON/releases/tag/1.1.1) (2019-11-04)
612
- Adjust Lock
713
- Closed issues

KakaJSON.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = "KakaJSON"
3-
s.version = "1.1.1"
3+
s.version = "1.1.2"
44
s.summary = "Fast conversion between JSON and model in Swift"
55
s.homepage = "https://github.com/kakaopensource/KakaJSON"
66
s.license = { :type => "MIT" }

KakaJSON.xcodeproj/project.pbxproj

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
/* End PBXAggregateTarget section */
2222

2323
/* Begin PBXBuildFile section */
24+
2D6B733823C4DDE40021DF3A /* Bugs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D4BC67323C4A29B00A2C4D6 /* Bugs.swift */; };
25+
2D79463E23B0D10B00B9B538 /* OCModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D79463D23B0D10B00B9B538 /* OCModel.m */; };
2426
627B5E462320EC490046E23D /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 627B5E0F2320EC480046E23D /* Metadata.swift */; };
2527
627B5E472320EC490046E23D /* Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = 627B5E102320EC480046E23D /* Property.swift */; };
2628
627B5E482320EC490046E23D /* FieldList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 627B5E132320EC480046E23D /* FieldList.swift */; };
@@ -106,6 +108,10 @@
106108
/* End PBXContainerItemProxy section */
107109

108110
/* Begin PBXFileReference section */
111+
2D4BC67323C4A29B00A2C4D6 /* Bugs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bugs.swift; sourceTree = "<group>"; };
112+
2D79463B23B0D10A00B9B538 /* KakaJSONTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "KakaJSONTests-Bridging-Header.h"; sourceTree = "<group>"; };
113+
2D79463C23B0D10B00B9B538 /* OCModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OCModel.h; sourceTree = "<group>"; };
114+
2D79463D23B0D10B00B9B538 /* OCModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OCModel.m; sourceTree = "<group>"; };
109115
627B5E0F2320EC480046E23D /* Metadata.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Metadata.swift; sourceTree = "<group>"; };
110116
627B5E102320EC480046E23D /* Property.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Property.swift; sourceTree = "<group>"; };
111117
627B5E112320EC480046E23D /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
@@ -172,7 +178,7 @@
172178
627B5E972320F08F0046E23D /* KakaJSON.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = KakaJSON.podspec; sourceTree = "<group>"; };
173179
627B5E992320F2710046E23D /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
174180
627B5E9A2320F2D40046E23D /* DevGuideline.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = DevGuideline.md; sourceTree = "<group>"; };
175-
"KakaJSON::KakaJSON::Product" /* KakaJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = KakaJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
181+
"KakaJSON::KakaJSON::Product" /* KakaJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = KakaJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
176182
"KakaJSON::KakaJSONTests::Product" /* KakaJSONTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = KakaJSONTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
177183
OBJ_13 /* XCTestManifests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = "<group>"; };
178184
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
@@ -197,6 +203,16 @@
197203
/* End PBXFrameworksBuildPhase section */
198204

199205
/* Begin PBXGroup section */
206+
2D79463723B0D0C600B9B538 /* OC */ = {
207+
isa = PBXGroup;
208+
children = (
209+
2D79463C23B0D10B00B9B538 /* OCModel.h */,
210+
2D79463D23B0D10B00B9B538 /* OCModel.m */,
211+
2D79463B23B0D10A00B9B538 /* KakaJSONTests-Bridging-Header.h */,
212+
);
213+
path = OC;
214+
sourceTree = "<group>";
215+
};
200216
627B5E0E2320EC480046E23D /* Metadata */ = {
201217
isa = PBXGroup;
202218
children = (
@@ -315,6 +331,7 @@
315331
children = (
316332
627B5E7D2320EC760046E23D /* Coding.swift */,
317333
627B5E7E2320EC760046E23D /* Global.swift */,
334+
2D4BC67323C4A29B00A2C4D6 /* Bugs.swift */,
318335
);
319336
path = Other;
320337
sourceTree = "<group>";
@@ -362,6 +379,7 @@
362379
OBJ_11 /* KakaJSONTests */ = {
363380
isa = PBXGroup;
364381
children = (
382+
2D79463723B0D0C600B9B538 /* OC */,
365383
627B5E7F2320EC760046E23D /* JSON_To_Model */,
366384
627B5E762320EC760046E23D /* Model_To_JSON */,
367385
627B5E7C2320EC760046E23D /* Other */,
@@ -469,6 +487,14 @@
469487
attributes = {
470488
LastSwiftMigration = 9999;
471489
LastUpgradeCheck = 9999;
490+
TargetAttributes = {
491+
"KakaJSON::KakaJSON" = {
492+
LastSwiftMigration = 1030;
493+
};
494+
"KakaJSON::KakaJSONTests" = {
495+
LastSwiftMigration = 1030;
496+
};
497+
};
472498
};
473499
buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "KakaJSON" */;
474500
compatibilityVersion = "Xcode 3.2";
@@ -559,13 +585,15 @@
559585
isa = PBXSourcesBuildPhase;
560586
buildActionMask = 0;
561587
files = (
588+
2D6B733823C4DDE40021DF3A /* Bugs.swift in Sources */,
562589
627B5E902320EC760046E23D /* JTM_06_CustomValue.swift in Sources */,
563590
627B5E922320EC760046E23D /* JTM_07_DynamicModel.swift in Sources */,
564591
627B5E8D2320EC760046E23D /* Global.swift in Sources */,
565592
627B5E8F2320EC760046E23D /* JTM_02_DataType.swift in Sources */,
566593
627B5E8B2320EC760046E23D /* MTJ_03_ModelArray.swift in Sources */,
567594
627B5E932320EC760046E23D /* JTM_04_ModelArray.swift in Sources */,
568595
627B5E8A2320EC760046E23D /* MTJ_01_Basic.swift in Sources */,
596+
2D79463E23B0D10B00B9B538 /* OCModel.m in Sources */,
569597
627B5E912320EC760046E23D /* JTM_05_KeyMapping.swift in Sources */,
570598
627B5E8C2320EC760046E23D /* Coding.swift in Sources */,
571599
627B5E882320EC760046E23D /* MTJ_05_CustomValue.swift in Sources */,
@@ -596,6 +624,8 @@
596624
OBJ_19 /* Debug */ = {
597625
isa = XCBuildConfiguration;
598626
buildSettings = {
627+
CLANG_ENABLE_MODULES = YES;
628+
DEFINES_MODULE = YES;
599629
ENABLE_TESTABILITY = YES;
600630
FRAMEWORK_SEARCH_PATHS = (
601631
"$(inherited)",
@@ -614,6 +644,7 @@
614644
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
615645
SKIP_INSTALL = YES;
616646
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
647+
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
617648
SWIFT_VERSION = 5.0;
618649
TARGET_NAME = KakaJSON;
619650
TVOS_DEPLOYMENT_TARGET = 9.0;
@@ -624,6 +655,8 @@
624655
OBJ_20 /* Release */ = {
625656
isa = XCBuildConfiguration;
626657
buildSettings = {
658+
CLANG_ENABLE_MODULES = YES;
659+
DEFINES_MODULE = YES;
627660
ENABLE_TESTABILITY = YES;
628661
FRAMEWORK_SEARCH_PATHS = (
629662
"$(inherited)",
@@ -725,6 +758,8 @@
725758
OTHER_LDFLAGS = "$(inherited)";
726759
OTHER_SWIFT_FLAGS = "$(inherited)";
727760
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
761+
SWIFT_OBJC_BRIDGING_HEADER = "Tests/KakaJSONTests/OC/KakaJSONTests-Bridging-Header.h";
762+
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
728763
SWIFT_VERSION = 5.0;
729764
TARGET_NAME = KakaJSONTests;
730765
TVOS_DEPLOYMENT_TARGET = 9.0;
@@ -751,6 +786,7 @@
751786
OTHER_LDFLAGS = "$(inherited)";
752787
OTHER_SWIFT_FLAGS = "$(inherited)";
753788
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
789+
SWIFT_OBJC_BRIDGING_HEADER = "Tests/KakaJSONTests/OC/KakaJSONTests-Bridging-Header.h";
754790
SWIFT_VERSION = 5.0;
755791
TARGET_NAME = KakaJSONTests;
756792
TVOS_DEPLOYMENT_TARGET = 9.0;

README.md

Lines changed: 136 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818

1919
### CocoaPods
2020
```ruby
21-
pod 'KakaJSON', '~> 1.1.1'
21+
pod 'KakaJSON', '~> 1.1.2'
2222
```
2323

2424
### Carthage
2525
```ruby
26-
github "kakaopensource/KakaJSON" ~> 1.1.1
26+
github "kakaopensource/KakaJSON" ~> 1.1.2
2727
```
2828

2929
### Swift Package Manager
@@ -54,6 +54,7 @@ Or you can login Xcode with your GitHub account. just search **KakaJSON**.
5454
- [Recursive](#recursive)
5555
- [Generic](#generic)
5656
- [Model Array](#model-array)
57+
- [Model Array In Dictionary](#model-array-in-dictionary)
5758
- [Convert](#convert)
5859
- [Listen](#listen)
5960
- [JSON To Model_02_Data Type](#json-to-model_02_data-type)
@@ -71,6 +72,9 @@ Or you can login Xcode with your GitHub account. just search **KakaJSON**.
7172
- [Data](#data)
7273
- [Date](#date)
7374
- [Enum](#enum)
75+
- [Enum In Array](#enum-in-array)
76+
- [Enum In Dictionary](#enum-in-dictionary)
77+
- [Enum Array In Dictionary](#enum-array-in-dictionary)
7478
- [Array](#array)
7579
- [Set](#set)
7680
- [Dictionary](#dictionary)
@@ -635,6 +639,58 @@ let cars7 = jsonString.kj.modelArray(type: type) as? [Car]
635639
let cars8 = modelArray(from: jsonString, type: type) as? [Car]
636640
```
637641

642+
### Model Array In Dictionary
643+
```swift
644+
struct Book: Convertible {
645+
var name: String = ""
646+
var price: Double = 0.0
647+
}
648+
649+
struct Person: Convertible {
650+
var name: String = ""
651+
var books: [String: [Book?]?]?
652+
}
653+
654+
let name = "Jack"
655+
let mobileBooks = [
656+
(name: "iOS", price: 10.5),
657+
(name: "Android", price: 8.5)
658+
]
659+
let serverBooks = [
660+
(name: "Java", price: 20.5),
661+
(name: "Go", price: 18.5)
662+
]
663+
664+
let json: [String: Any] = [
665+
"name": name,
666+
"books": [
667+
"mobile": [
668+
["name": mobileBooks[0].name, "price": mobileBooks[0].price],
669+
["name": mobileBooks[1].name, "price": mobileBooks[1].price]
670+
],
671+
"server": [
672+
["name": serverBooks[0].name, "price": serverBooks[0].price],
673+
["name": serverBooks[1].name, "price": serverBooks[1].price]
674+
]
675+
]
676+
]
677+
678+
let person = json.kj.model(Person.self)
679+
XCTAssert(person.name == name)
680+
let books0 = person.books?["mobile"]
681+
XCTAssert(books0??.count == mobileBooks.count)
682+
for i in 0..<mobileBooks.count {
683+
XCTAssert(books0??[i]?.name == mobileBooks[i].name);
684+
XCTAssert(books0??[i]?.price == mobileBooks[i].price);
685+
}
686+
let books1 = person.books?["server"]
687+
XCTAssert(books1??.count == serverBooks.count)
688+
for i in 0..<serverBooks.count {
689+
XCTAssert(books1??[i]?.name == serverBooks[i].name);
690+
XCTAssert(books1??[i]?.price == serverBooks[i].price);
691+
}
692+
```
693+
638694
### Convert
639695
```swift
640696
struct Cat: Convertible {
@@ -651,7 +707,7 @@ var cat = Cat()
651707
// fill a cat instance with json
652708
// .kj_m is a mutable version of .kj
653709
cat.kj_m.convert(json)
654-
XCTAssert(cat.name == "Miaomiao"
710+
XCTAssert(cat.name == "Miaomiao")
655711
XCTAssert(cat.weight == 6.66)
656712

657713
```
@@ -1276,6 +1332,83 @@ XCTAssert(student2?.grade3 == .great)
12761332
XCTAssert(student2?.grade4 == .perfect)
12771333
```
12781334

1335+
### Enum In Array
1336+
```swift
1337+
enum Grade: String, ConvertibleEnum {
1338+
case perfect = "A"
1339+
case great = "B"
1340+
case good = "C"
1341+
case bad = "D"
1342+
}
1343+
1344+
struct Student: Convertible {
1345+
var name: String?
1346+
var grades: [Grade]?
1347+
}
1348+
1349+
let json: [String: Any] = [
1350+
"name": "Jack",
1351+
"grades": ["D", "B"]
1352+
]
1353+
1354+
let stu = json.kj.model(Student.self)
1355+
XCTAssert(stu.name == "Jack")
1356+
XCTAssert(stu.grades?[0] == .bad)
1357+
XCTAssert(stu.grades?[1] == .great)
1358+
```
1359+
1360+
### Enum In Dictionary
1361+
```swift
1362+
enum Grade: String, ConvertibleEnum {
1363+
case perfect = "A"
1364+
case great = "B"
1365+
case good = "C"
1366+
case bad = "D"
1367+
}
1368+
1369+
struct Student: Convertible {
1370+
var name: String?
1371+
var grades: [String: Grade]?
1372+
}
1373+
1374+
let json: [String: Any] = [
1375+
"name": "Jack",
1376+
"grades": ["2019": "D", "2020": "B"]
1377+
]
1378+
1379+
let stu = json.kj.model(Student.self)
1380+
XCTAssert(stu.name == "Jack")
1381+
XCTAssert(stu.grades?["2019"] == .bad)
1382+
XCTAssert(stu.grades?["2020"] == .great)
1383+
```
1384+
1385+
### Enum Array In Dictionary
1386+
```swift
1387+
enum Grade: String, ConvertibleEnum {
1388+
case perfect = "A"
1389+
case great = "B"
1390+
case good = "C"
1391+
case bad = "D"
1392+
}
1393+
1394+
struct Student: Convertible {
1395+
var name: String?
1396+
var grades: [String: [Grade?]]?
1397+
}
1398+
1399+
let json: [String: Any] = [
1400+
"name": "Jack",
1401+
"grades": ["2019": ["A", "B"], "2020": ["C", "D"]]
1402+
]
1403+
1404+
let stu = json.kj.model(Student.self)
1405+
XCTAssert(stu.name == "Jack")
1406+
XCTAssert(stu.grades?["2019"]?[0] == .perfect)
1407+
XCTAssert(stu.grades?["2019"]?[1] == .great)
1408+
XCTAssert(stu.grades?["2020"]?[0] == .good)
1409+
XCTAssert(stu.grades?["2020"]?[1] == .bad)
1410+
```
1411+
12791412
### Array
12801413
```swift
12811414
// Support conversion between Array\NSArray\NSMutableArray and Set\NSSet\NSMutableSet

0 commit comments

Comments
 (0)