美文网首页
playground 简易json字符串转化Model

playground 简易json字符串转化Model

作者: 搞好关系 | 来源:发表于2019-01-11 18:13 被阅读5次

最近被公司超长的json【惊悚】给烦死了,趁着午休简易写了一个,还有很多改进之处,慢慢完善吧
1 完善出转化Object的
2 完善出转化Swift
3 晚上随意转化swift Object

比较粗糙六个Tag

extension String: TMObjcProperty{
    
    func convertObjcProperty() -> String {
        return """
        @property(copy,nonatomic) NSString * \(self);
        """
     }
    func convertObjcClassProperty() -> String{
        return """
        @property(copy,nonatomic) \(self.capitalized) * \(self);
        """
    }
    func convertObjcArrayProperty() -> String{
        return """
        @property(strong,nonatomic) NSArray<\(self.capitalized)*> * \(self);
        """
    }
    func convertObjcStringProperty() -> String {
        return """
        @property(copy,nonatomic) NSString * \(self);
        """
    }
    func convertObjcNumberProperty() -> String {
        return """
        @property(assign, nonatomic) NSNumber * \(self);
        """
    }
}
var pName = TMObjecConvertProperty.init("name").property

var item  = ["name":"Jack", "list":[["name":"Jack"]]] as [String : Any]

extension Dictionary{
    func toModel(_ className: String = "ItemClassName", superClassName:String = "NSObject", frameworks:[String] = ["#import<UIKit/UIKit.h>"]) -> String{
        var container:[String] = [String]()
        var imports = frameworks
        for (key, value) in self {
            let k = "\(key)"
            
            switch value {
            case is String :
              container.append(  k.convertObjcProperty())
                break
            case is Double:
              container.append(  k.convertObjcNumberProperty())
            case is Int:
              container.append(  k.convertObjcNumberProperty())
            case is Bool:
              container.append(  k.convertObjcNumberProperty())
                break
            case is Array<Any> :
                container.append(  k.convertObjcArrayProperty())
                print((value as! Array<Any>).toModel(k.capitalized))
                break
            case is Dictionary:
                container.append( k.convertObjcClassProperty())
                imports.append("""
                    #import"\(k.capitalized).h"
                    """)
                print((value as! Dictionary<String, Any>).toModel(k.capitalized))
                break
            default:
                print("")
            }
        }
        return """
        \(imports.joined(separator: "\n"))
        @interface \(className.capitalized):\(superClassName)
        \(container.joined(separator: "\n"))
        @end\n
        
        
        @interface \(className.capitalized)()
        //TODO 子这里补全extension
        
        @end
        
        @implementation \(className.capitalized)
        
        @end
        """
        
    }
}
extension Array{
    func toModel(_ propertyName: String = "list", className: String = "Item") -> String{
        var dest = ""
        if self.isEmpty{
            dest = "@property(nonatomic, strong) NSArray *\(propertyName);\n"
        }else{
        let value = self.first!
            switch  value {
            case is Dictionary<String, Any> :
                dest = "@property(nonatomic, strong) NSArray<\(className.capitalized)*> *\(propertyName);\n"
                
                print((value as! Dictionary<String, Any> ).toModel(propertyName.capitalized))
                break
            case is String:
                dest = "@property(nonatomic, strong) NSArray<String*> *\(propertyName);\n"
                break
            case is Bool:
                dest = "@property(nonatomic, strong) NSArray<NSNumber*> *\(propertyName);\n"
                break
            case is Int:
                dest = "@property(nonatomic, strong) NSArray<NSNumber*> *\(propertyName);\n"
                break
            case is Double:
                dest = "@property(nonatomic, strong) NSArray<NSNumber*> *\(propertyName);\n"
                break
            default:
                dest = ""
            }
     }
        return dest
    }
}

//print(["name":"jack", "age":12,"height":175.3, "sub":["name":"Jack"], "items":[1,2,3]].toModel())
//print("\n")
//print([["name":"JJJ"]].toModel())

do{
let jsonObj =  try JSONSerialization.jsonObject(with: json.data(using: String.Encoding.utf8)!, options: JSONSerialization.ReadingOptions.allowFragments) as! Dictionary<String, Any>
print(jsonObj.toModel("TlbModel"))
    
}catch{
    print(error.localizedDescription)
}

测试用例

print(["name":"jack", "age":12,"height":175.3, "sub":["name":"Jack"], "items":[1,2,3]].toModel())
print("\n")
print([["name":"JJJ"]].toModel())

测试结果

#import<UIKit/UIKit.h>
@interface Sub:NSObject
@property(copy,nonatomic) NSString * name;
@end



@interface Sub()
//TODO 子这里补全extension

@end

@implementation Sub

@end
@property(nonatomic, strong) NSArray<NSNumber*> *Items;

#import<UIKit/UIKit.h>
#import"Sub.h"
@interface Itemclassname:NSObject
@property(assign, nonatomic) NSNumber * height;
@property(assign, nonatomic) NSNumber * age;
@property(copy,nonatomic) Sub * sub;
@property(copy,nonatomic) NSString * name;
@property(strong,nonatomic) NSArray<Items*> * items;
@end



@interface Itemclassname()
//TODO 子这里补全extension

@end

@implementation Itemclassname

@end


#import<UIKit/UIKit.h>
@interface List:NSObject
@property(copy,nonatomic) NSString * name;
@end



@interface List()
//TODO 子这里补全extension

@end

@implementation List

@end
@property(nonatomic, strong) NSArray<Item*> *list;

相关文章

网友评论

      本文标题:playground 简易json字符串转化Model

      本文链接:https://www.haomeiwen.com/subject/odffdqtx.html