@@ -75,7 +75,7 @@ Or you can login Xcode with your GitHub account. just search **KakaJSON**.
7575 - [ Set] ( #set )
7676 - [ Dictionary] ( #dictionary )
7777- [ JSON To Model_03_Key Mapping] ( #json-to-model_03_key-mapping )
78- - [ Basic Usage] ( #basic-usage-1 )
78+ - [ Basic Usage] ( #basic-usage )
7979 - [ Camel -> Underline] ( #camel---underline )
8080 - [ Underline -> Camel] ( #underline---camel )
8181 - [ Inheritance] ( #inheritance-1 )
@@ -1749,11 +1749,11 @@ struct Car: Convertible {
17491749
17501750/*
17511751 If there are many settings of modelKey, the rule is (e.g. Student)
1752- ① use Student's kj_modelKey firstly
1753- ② if ① dosen't exist, use ConvertibleConfig of Student
1754- ③ if ①② dosen't exist, use ConvertibleConfig of Student's superclass
1755- ④ if ①②③ dosen't exist, use ConvertibleConfig of Student's superclass's superclass...
1756- ⑤ if ①②③④ dosen't exist, use gloabal ConvertibleConfig
1752+ 1. use Student's kj_modelKey firstly
1753+ 2. if 1 dosen't exist, use ConvertibleConfig of Student
1754+ 3. if 1\2 dosen't exist, use ConvertibleConfig of Student's superclass
1755+ 4. if 1\2\3 dosen't exist, use ConvertibleConfig of Student's superclass's superclass...
1756+ 5. if 1\2\3\4 dosen't exist, use gloabal ConvertibleConfig
17571757 */
17581758
17591759// Person, Student, Car all have kj_modelKey, so use kj_modelKey firstly
@@ -1796,9 +1796,10 @@ struct Dog: Convertible {
17961796 // name -> data[1]["dog"]["name"]
17971797 case " name" : return " data.1.dog.name"
17981798 // try every mapping of array orderly until success
1799- // ① nickName -> nick_name
1800- // ② nickName -> dog["nickName"]
1801- // ③ nickName -> dog["nick_name"]
1799+ // 1. nickName -> nickName
1800+ // 2. nickName -> nick_name
1801+ // 3. nickName -> dog["nickName"]
1802+ // 4. nickName -> dog["nick_name"]
18021803 case " nickName" : return [" nickName" , " nick_name" , " dog.nickName" , " dog.nick_name" ]
18031804 default : return property.name
18041805 }
@@ -1831,6 +1832,57 @@ XCTAssert(dog.age == age)
18311832XCTAssert (dog.nickName == nickName1)
18321833XCTAssert (dog.toy ? .name == toy.name )
18331834XCTAssert (dog.toy ? .price == toy.price )
1835+
1836+
1837+ /* -------------------------------------------------*/
1838+
1839+ struct Team: Convertible {
1840+ var name: String ?
1841+ var captainName: String ?
1842+
1843+ func kj_modelKey (from property : Property) -> ModelPropertyKey {
1844+ switch property.name {
1845+ case " captainName" : return " captain.name"
1846+ default : return property.name
1847+ }
1848+ }
1849+ }
1850+
1851+ let teamName = " V"
1852+ let captainName = " Quentin"
1853+
1854+ let json: [String : Any ] = [
1855+ " name" : teamName,
1856+ " captain.name" : captainName,
1857+ ]
1858+ let team = json.kj .model (Team.self )
1859+ XCTAssert (team.name == teamName)
1860+ XCTAssert (team.captainName == captainName)
1861+
1862+ /* -------------------------------------------------*/
1863+
1864+ struct Model: Convertible {
1865+ var valueA: String ?
1866+ var valueB: String ?
1867+
1868+ func kj_modelKey (from property : Property) -> ModelPropertyKey {
1869+ switch property.name {
1870+ case " valueA" : return " a.0.a"
1871+ case " valueB" : return " b.0.b.0.b"
1872+ default : return property.name
1873+ }
1874+ }
1875+ }
1876+
1877+ let json: [String : Any ] = [
1878+ " a" : [ " l" , " u" , " o" ],
1879+ " b" : [
1880+ [ " b" : [ " x" , " i" , " u" ] ]
1881+ ]
1882+ ]
1883+ let model = json.kj .model (Model.self )
1884+ XCTAssert (model.valueA == " l" )
1885+ XCTAssert (model.valueB == " x" )
18341886```
18351887
18361888
@@ -1907,6 +1959,55 @@ XCTAssert(person.name == "Jack")
19071959let pet = person.pet as? Dog
19081960XCTAssert (pet? .name == " Wang" )
19091961XCTAssert (pet? .weight == 109.5 )
1962+
1963+ /* -------------------------------------------------*/
1964+
1965+ class Book: Convertible {
1966+ var name: String = " "
1967+ var price: Double = 0.0
1968+ required init () {}
1969+ }
1970+
1971+ struct Person: Convertible {
1972+ var name: String = " "
1973+ // [AnyObject]、[Convertible]、NSArray、NSMutableArray
1974+ var books: [Any ]?
1975+
1976+ func kj_modelValue (from jsonValue : Any ? ,
1977+ _ property : Property) -> Any ? {
1978+ if property.name != " books" { return jsonValue }
1979+ // if books is `NSMutableArray`, neet convert `Array` to `NSMutableArray`
1980+ // because `Array` to `NSMutableArray` is not a bridging conversion
1981+ return (jsonValue as? [Any ])? .kj .modelArray (Book.self )
1982+ }
1983+ }
1984+
1985+ let name = " Jack"
1986+ let books = [
1987+ (name : " Fast C++" , price : 666 ),
1988+ (name : " Data Structure And Algorithm" , price : 1666 )
1989+ ]
1990+
1991+ let json: [String : Any ] = [
1992+ " name" : name,
1993+ " books" : [
1994+ [" name" : books[0 ].name , " price" : books[0 ].price ],
1995+ [" name" : books[1 ].name , " price" : books[1 ].price ]
1996+ ]
1997+ ]
1998+
1999+ let person = json.kj .model (Person.self )
2000+ XCTAssert (person.name == name)
2001+
2002+ XCTAssert (person.books ? .count == books.count )
2003+
2004+ let book0 = person.books ? [0 ] as? Book
2005+ XCTAssert (book0? .name == books[0 ].name )
2006+ XCTAssert (book0? .price == Double (books[0 ].price ))
2007+
2008+ let book1 = person.books ? [1 ] as? Book
2009+ XCTAssert (book1? .name == books[1 ].name )
2010+ XCTAssert (book1? .price == Double (books[1 ].price ))
19102011```
19112012
19122013### Example
0 commit comments