Codable使用

图片 1

二零一二-11-08 17:35:00小编:水栗褐眼泪第一星座网

准备JSON数据

剖析vb生成的RES文书档案前段时间代码已解析实现。居然没有办法上传附属类小零器件????小编:繁华过后

友大家,还在为投机和对方是还是不是速配而郁郁寡欢吗?飞快看恢复生机吗!

let sample1Json = """
{
    "id": 1000,
    "name": "基金1",
    "review": null,
}
"""

let sample2Json = """
[
    {
    "id": 1000,
    "name": "基金1",
    "review": "收益高+期限短"
    },
    {
    "id": 1001,
    "name": "基金2",
    "review": "适合短期投资"
    }
]
"""

let sample3Json = """
{
    "text": "Agree!Nice weather!",
    "user": {
        "name": "Jack",
        "icon": "lufy.png"
    },
    "retweetedStatus": {
        "text": "nice weather",
        "user": {
            "name": "Rose",
            "icon": "nami.png"
        }
    }
}
"""

let sample4Json = """
{
    "check0": true,
    "check1": 1,
}
"""

let sample5Json = """
{
    "date": "2017-11-16T02:02:55.000-08:00"
}
"""
OptionExplicitConstRT_STRING=6ConstRT_VERSION=16ConstRT_MENU=4ConstRT_ICON=3ConstRT_HTML=23ConstRT_FONTDIR=7ConstRT_FONT=8ConstRT_DIALOG=5ConstRT_CURSOR=1ConstRT_BITMAP=2ConstRT_ANICURSOR=21ConstRT_GROUP_CURSOR=12ConstRT_GROUP_ICON=14ConstRT_UNKNOWN=0PrivateTypeRESOURCEHEADERDataSizeasAsLongHeaderSizeasAsLongResTypeasAsVariant'[OrdinalornameTYPE];ResNameasAsVariant'需要说明的就是这里的Type和Name,有可能是一个字符串,也有可能是一个双字节整型,所以用Variant[OrdinalornameNAME];DataVersionasAsLongMemoryFlagsasAsIntegerLanguageIdasAsIntegerVersionasAsLongCharacteristicsasAsLongResData()AsByte'这是具体的数据,可以留给后续处理时使用,仅当DataSize0时才有EndTypeDimMemory()AsByteRem参考资料参考资料(VS.85).aspxRem参考资料字符串表Rem编号相连的多个字符串会放入一个表内PrivateSubCommand1_Click()Rem当前地址指针DimIndexAsLongRem当前项开始的地址DimBaseAddrAsLongRem数据大小DimDataSizeasAsLongRem资源头大小DimHeaderSizeasAsLongRem判断用resname和restype是字符串还是数值DimResNameJAsIntegerDimResTypeJAsIntegerRem储存resname和restype的数值DimResTypeAsIntegerDimResNameAsIntegerRem储存resname和restype的字符串DimlpResNameAsStringDimlpResTypeAsStringRem资源的附加信息DimDataVersionasAsLongDimMemoryFlagsasAsIntegerDimLanguageIdasAsIntegerDimVersionasAsLongDimCharacteristicsasAsLongRem字符串解析相关DimlStrStartAsLong,lChrAsIntegerDimChrLengthAsLong,DataLengthAsLongDimlStrAsStringDataLength=UBound(Memory())+1List1.ClearRem前面有一个32字节的空结构Index=H20DoRem清空变量ResType=0ResName=0Rem是否完成?IfIndex+4=DataLengthThenExitDoEndIfRem保存该结构地址供读取数据用BaseAddr=IndexRem读取数据大小头大小(包括DataSizeas和HeaderSizeas)CopyMemoryDataSizeas,Memory(Index),4:Index=Index+4CopyMemoryHeaderSizeas,Memory(Index),4:Index=Index+4Rem读取文件Type解析CopyMemoryResTypeJ,Memory(Index),2:Index=Index+2Rem解析RES_Type和RES_NameSelectCaseResTypeJCase-1Rem如果为-1那么说明后面跟着数值型ResTypeCopyMemoryResType,Memory(Index),2:Index=Index+2CopyMemoryResNameJ,Memory(Index),2:Index=Index+2Rem用同样的方法获取RES_NAMEIfResNameJ=-1ThenCopyMemoryResName,Memory(Index),2:Index=Index+2lpResName=CStr(ResName)ElselStrStart=IndexRem解析NameDoCopyMemorylChr,Memory(Index),2:Index=Index+2IflChr=0ThenRem0为字符串结束符ChrLength=Index-lStrStart-2lStr=Space(ChrLength/2)CopyMemoryByValStrPtr(lStr),Memory(lStrStart),ChrLengthlpResName=lStrExitDoEndIfLoopEndIflpResType=CStr(ResType)CaseElseRem如果不为-1那么说明后面跟着UniCode字符串Rem解析TypelStrStart=Index-2DoCopyMemorylChr,Memory(Index),2:Index=Index+2IflChr=0ThenRem0为字符串结束符ChrLength=Index-lStrStart-2lStr=Space(ChrLength/2)CopyMemoryByValStrPtr(lStr),Memory(lStrStart),ChrLengthlpResType=lStrExitDoEndIfLoopRem解析Res_Name类型CopyMemoryResNameJ,Memory(Index),2:Index=Index+2IfResNameJ=-1ThenCopyMemoryResName,Memory(Index),2:Index=Index+2lpResName=CStr(ResName)ElselStrStart=Index-2Rem解析NameDoCopyMemorylChr,Memory(Index),2:Index=Index+2IflChr=0ThenChrLength=Index-lStrStart-2lStr=Space(ChrLength/2)CopyMemoryByValStrPtr(lStr),Memory(lStrStart),ChrLengthlpResName=lStrExitDoEndIfLoopEndIfEndSelectIf(ResType+ResName)Mod40ThenRem如果(ResType+ResName)Mod40(看网上资料说如果不为0那只能是2)则附加2字节信息Index=Index+2EndIfRem读取相关信息CopyMemoryDataVersionas,Memory(Index),4:Index=Index+4CopyMemoryMemoryFlagsas,Memory(Index),2:Index=Index+2CopyMemoryLanguageIdas,Memory(Index),2:Index=Index+2CopyMemoryVersionas,Memory(Index),4:Index=Index+4CopyMemoryCharacteristicsas,Memory(Index),4:Index=Index+4Rem计算上资源的数据长度(下个资源地址=这个资源地址+头长度+数据长度)Index=BaseAddr+DataSizeas+HeaderSizeasRem4字节对齐?DimIntExAsLongIntEx=Index\4IntEx=IntEx*4RemVb的CUSTOM等自定义资源类型可能是因为对齐原因吧多了四个字节RemRc编译的自动4字节对齐了IfIndexIntExThenIndex=IntExIndex=Index+4ElseIndex=IntExEndIfRem资源中的位图少了前面的16字节数据'biSizeAsLong'biWidthAsLong'biHeightAsLong'biPlanesAsInteger'biBitCountAsIntegerIfResType=RT_STRINGThenRem=======================================================开始处理字符串表Rem字符串Id=编号/16+1DimStrLenAsInteger,lpIndexAsLong,InitAsBooleanlpIndex=BaseAddr+HeaderSizeas'+10Init=FalseDoCopyMemoryStrLen,Memory(lpIndex),2:lpIndex=lpIndex+2IfStrLen=0ThenIfInitThenExitDoElseGoToNextGoEndIfEndIfInit=TruelStr=Space(StrLen)CopyMemoryByValStrPtr(lStr),Memory(lpIndex),StrLen*2:lpIndex=lpIndex+StrLen*2MsgBoxlStr,16,"字符串表内容"NextGo:LoopRem=======================================================字符串表处理完毕EndIf'Debug.Print"BaseAddr",BaseAddrDebug.Print"DataSizeas",DataSizeasDebug.Print"HeaderSizeas",HeaderSizeasDebug.Print"ResName",lpResNameDebug.Print"ResType",lpResType,GetResType(ResType)List1.AddItemlpResNamevbTablpResTypevbTabGetResType(ResType)Debug.Print"DataVersionas",DataVersionasDebug.Print"MemoryFlagsas",MemoryFlagsasDebug.Print"LanguageIdas",LanguageIdasDebug.Print"Versionas",VersionasDebug.Print"Characteristicsas",CharacteristicsasDebug.Print"==========================================================="NextItem:LoopEndSub'工程1'Resource'PrivateSubForm_Load()GetPictureByte"Resource.RES",Memory()EndSubPublicFunctionGetPictureByte(ImageFileAsString,Memory()AsByte)AsByteDimFilenAsIntegerFilen=FreeFileEraseMemoryOpenImageFileForBinaryAs#FilenReDimMemory(LOF(Filen)-1)AsByteGet#Filen,,MemoryClose#FilenEndFunctionPublicFunctionGetResType(lTypeAsInteger)AsStringSelectCaselTypeCaseRT_UNKNOWN:GetResType="未知类型资源(用户自定义)"CaseRT_STRING:GetResType="字符串表"CaseRT_VERSION:GetResType="版本信息"CaseRT_MENU:GetResType="菜单"CaseRT_ICON:GetResType="图标"CaseRT_HTML:GetResType="HTML资源"CaseRT_FONTDIR:GetResType="字体目录资源。"CaseRT_FONT:GetResType="字体资源"CaseRT_DIALOG:GetResType="对话框"CaseRT_CURSOR:GetResType="光标"CaseRT_BITMAP:GetResType="位图"CaseRT_ANICURSOR:GetResType="动画"CaseRT_GROUP_CURSOR:GetResType="与硬件无关的光标资源"CaseRT_GROUP_ICON:GetResType="独立于硬件的图标资源"CaseElse:GetResType=lTypeEndSelectEndFunction

先是星座网为您提供最准的12星座配成对指数速配表,它会帮你们分析星座爱情啊~~还等如何?飞速收藏吧!

1、基本模型深入分析

Sample.swift

class Sample: Codable {
    var id: Int?
    var name: String?
    var review: String?
}

json转model,少年老成行代码化解

let data = sample1Json.data(using: .utf8)
do {
    // decode 解码
    let x: Sample = try JSONDecoder().decode(Sample.self, from: data!)
} catch {
    print(error)
}

浅析之后的结果如下:

(lldb) p x
(CodableDemo.Sample) $R0 = 0x00006040000b0c80 {
  id = 1000
  name = "基金1"
  review = nil 
}
(lldb) 

白羊男 金牛男 双子男 巨蟹男 亚洲狮男 处女男 白羊女 指数:80 配成对深入分析指数:70 配成对深入剖析 指数:90 配成对深入分析指数:50 配对深入分析 指数:100 配成对剖析 指数:40 配成对深入分析 金牛女 指数:70 配对深入分析 指数:80 配对解析指数:70 配成对分析 指数:90 配成对拆解剖析 指数:50 配对深入分析 指数:100 配成对解析双子女 指数:90 配成对剖析 指数:70 配成对分析指数:80 配成对分析指数:70 配成对拆解解析 指数:90 配成对深入分析 指数:50 配成对分析 巨蟹女 指数:50 配对剖判指数:90 配成对深入分析指数:70 配成对深入深入分析 指数:80 配成对拆解深入分析 指数:70 配对深入分析指数:90 配成对解析欧洲狮女 指数:100 配成对解析指数:50 配对深入分析指数:90 配成对剖析指数:70 配对分析 指数:80 配成对分析指数:70 配成对深入解析处女女 指数:40 配成对分析指数:100 配成对解析指数:50 配对深入剖析 指数:90 配成对深入分析 指数:70 配成对深入分析指数:80 配成对解析 天秤女 指数:60 配成对解析指数:40 配成对拆解解析 指数:100 配成对拆解剖判 指数:50 配对拆解解析 指数:90 配成对深入剖析指数:70 配成对深入分析 天蝎女 指数:40 配对解析 指数:60 配成对拆解解析 指数:40 配成对深入分析 指数:100 配成对深入深入分析 指数:50 配成对解析 指数:90 配对深入分析 射手女 指数:100 匹配成对解析 指数:40 配对深入分析 指数:60 配对深入深入分析 指数:40 配成对解析指数:100 配对深入深入分析 指数:50 配成对解析 摩羯女 指数:50 配成对深入分析 指数:100 配成对深入分析 指数:40 配成对解析 指数:60 配成对分析 指数:40 配对深入分析 指数:100 配成对解析 凤尾瓶女 指数:90 配对拆解剖析 指数:50 配对深入深入分析 指数:100 配成对深入分析指数:40 配成对深入分析 指数:60 配成对解析 指数:40 配对深入分析 双鱼女 指数:70 配成对解析 指数:80 配成对深入分析 指数:50 配对拆解深入分析 指数:100 配成对剖判 指数:40 配成对深入分析 指数:60 配成对深入分析 天秤男 天蝎男 射手男 摩羯男 水瓶男 双鱼男 白羊女 指数:60 配成对分析 指数:40 配成对深入分析指数:100 配成对深入分析指数:50 配对深入解析 指数:90 配成对深入分析 指数:70 配对解析 金牛女 指数:40 配成对深入分析指数:60 配成对拆解解析 指数:40 配对深入深入分析 指数:100 配成对解析 指数:50 配成对解析指数:90 配对拆解解析 双子女 指数:100 配成对拆解深入分析 指数:40 配成对深入分析指数:60 配成对解析指数:40 配成对拆解深入分析 指数:100 配对拆解剖析 指数:50 配对解析 巨蟹女 指数:50 匹配成对解析指数:100 配成对剖析指数:40 配成对剖析 指数:60 配对解析指数:40 配对深入分析指数:100 配成对深入分析克鲁格狮女 指数:90 配对剖判 指数:50 配成对分析 指数:100 配成对解析指数:40 配对深入深入分析 指数:60 配成对深入分析指数:40 配成对解析 处女女 指数:70 配成对拆解分析 指数:90 配成对深入分析指数:50 配成对剖析指数:100 配成对剖判 指数:40 配对剖析指数:60 配成对剖判 天秤女 指数:80 配对深入解析 指数:70 配对剖判 指数:90 配成对深入分析 指数:50 配对拆解解析 指数:100 配成对深入分析 指数:40 配对深入分析 天蝎女 指数:70 配对分析 指数:80配成对深入分析指数:70 配对拆解深入分析 指数:90 配成对剖判 指数:50 配成对深入分析 指数:100 配对解析射手女 指数:90 配成对分析 指数:70 配对深入深入分析 指数:80 配成对剖判 指数:70 配成对拆解深入分析 指数:90 配对剖析 指数:50 配成对深入解析 摩羯女 指数:50 配成对深入分析指数:90 配成对拆解剖析 指数:70 配成对分析 指数:80 配成对分析 指数:70 配成对分析指数:90 配成对深入分析 酒瓶女 指数:100 配成对拆解剖析 指数:50 配成对深入分析 指数:90 配成对深入解析 指数:70 配对分析 指数:80 配成对深入分析 指数:70 配对深入分析 双鱼女 指数:40 配成对拆解深入分析 指数:100 配成对深入深入分析 指数:50 配成对深入剖析 指数:90 配成对解析指数:70 配成对拆解深入分析 指数:80 配对深入分析

2、模型剖析-自定义key

class Sample: Codable {
    var id: Int32?
    var re_name: String?
    var review: String?

    enum CodingKeys: String, CodingKey {
        case id
        case re_name = "name" /// 自定义key
        case review
    }
}

留心:假如要求自定义key,全体key都亟需在CodingKeys中定义,不然会报error: Type 'Sample' does not conform to protocol 'Decodable'本条指鹿为马

json拆解深入分析代码同上

深入分析结果如下:

(lldb) p x
(CodableDemo.Sample) $R0 = 0x00006000000af000 {
  id = 1000
  re_name = "基金1"
  review = nil
}
(lldb)