1.关于本文
这几天打算写一个工具类JsonXmlHelper,用来进行用XML来保存JSON格式文件的工作。该工具类中要实现2个最主要的函数:
1)将JSON格式的内容写入到地址为address的XML中:WriteJsonToXml
2)把函数1中构造的XML文件恢复成JSON格式文档:RecoverJsonFromXml
函数1的实现将在本文中给出,函数2的实现将在下一篇博文中给出
2.代码说明
1)添加引用:Newtonsoft.Json.dll
2)导入库
'JSON解析相关函数,需要添加引用Newtonsoft.Json.dll ImportsNewtonsoft.Json ImportsNewtonsoft.Json.Linq 'XMl解析相关函数 ImportsSystem.Xml
3)在模块ModuleTest中建立类JsonXmlHelper
4)两个基础函数:
ReadFromFile(从文件中读取内容赋值到一个字符串)
'''<summary> '''将字符串中内容写入到文件 '''</summary> '''<paramname="address">文件地址</param> '''<paramname="content">被写入文件的字符串</param> '''<remarks></remarks> PublicSharedSubWriteToFile(addressAsString,contentAsString) Try DimswAsIO.StreamWriter sw=NewIO.StreamWriter(address,False,System.Text.Encoding.UTF8) sw.Write(content) sw.Close() sw.Dispose() CatchexAsException ThrowNewException(ex.Message) EndTry EndSub '''<summary> '''从文件中读取信息到字符串 '''</summary> '''<paramname="address">文件地址</param> '''<returns>读取到的字符串</returns> '''<remarks></remarks> PublicSharedFunctionReadFromFile(addressAsString) Try DimsrAsIO.StreamReader sr=IO.File.OpenText(address) Returnsr.ReadToEnd() CatchexAsException ThrowNewException(ex.Message) EndTry EndFunction
5)函数WriteJsonToXml的实现
'''<summary> '''将JSON格式的内容写入到地址为address的XML中 '''</summary> '''<paramname="address">要存入的文件地址</param> '''<paramname="json">源JSON字符串</param> '''<remarks></remarks> PublicSharedSubWriteJsonToXml(addressAsString,jsonAsString) '如果存在同名文件则先删除 IfIO.File.Exists(address)Then IO.File.Delete(address) EndIf '建立XML文档 DimwriterAsXmlTextWriter= NewXmlTextWriter(address,Text.Encoding.GetEncoding("GBK")) writer.Formatting=Xml.Formatting.Indented writer.WriteStartDocument() writer.WriteComment("这个XML文档中存储了一个JSON格式的信息") '递归遍历JSON中的项并写入到XML中 writer.WriteStartElement("Root") '将JSON字符串中内容写入到XML文档 WriteToXml(writer,json) writer.WriteEndElement()'Root结点结束 writer.WriteEndDocument() writer.Close() 'XML文档创建结束 EndSub '''<summary> '''将一段JSON格式字符串写入到XML文件中 '''</summary> '''<paramname="writer"></param> '''<paramname="json"></param> '''<remarks></remarks> PrivateSharedSubWriteToXml(writerAsXmlTextWriter,jsonAsString) DimjobjAsJObject=JObject.Parse(json) '遍历读取到的JSON字符串 ForEachjtempAsJPropertyInjobj.Children '根据读入的不同数据类型分类讨论 'Console.WriteLine(jtemp.Name.ToString&""&jtemp.Value.ToString) SelectCasejtemp.Value.Type CaseJTokenType.Object writer.WriteStartElement(jtemp.Name.ToString(),"") writer.WriteAttributeString("Type","Object") WriteToXml(writer,jtemp.Value.ToString) writer.WriteEndElement() CaseJTokenType.Array writer.WriteStartElement(jtemp.Name.ToString(),"Array") '遍历数组读取值 ForiAsInteger=0Tojtemp.Value.Count-1 writer.WriteAttributeString("Value"&i,jtemp.Value(i).ToString) Next writer.WriteEndElement() CaseJTokenType.String writer.WriteStartElement(jtemp.Name.ToString(),"String") writer.WriteAttributeString("Value",jtemp.Value.ToString) writer.WriteEndElement() CaseJTokenType.Boolean writer.WriteStartElement(jtemp.Name.ToString(),"Boolean") writer.WriteAttributeString("Value",jtemp.Value.ToString) writer.WriteEndElement() CaseJTokenType.Integer writer.WriteStartElement(jtemp.Name.ToString(),"Integer") writer.WriteAttributeString("Value",jtemp.Value.ToString) writer.WriteEndElement() CaseJTokenType.Float writer.WriteStartElement(jtemp.Name.ToString(),"Float") writer.WriteAttributeString("Value",jtemp.Value.ToString) writer.WriteEndElement() CaseJTokenType.Null writer.WriteStartElement(jtemp.Name.ToString(),"Null") writer.WriteAttributeString("Value",jtemp.Value.ToString) writer.WriteEndElement() CaseElse EndSelect Next EndSub
1)建立结构Person
PublicClassPerson PublicNameAsString'姓名 PublicAgeAsInteger'年龄 PublicSex_is_MaleAsBoolean'性别 PublicStructurePartnerInfo'伙伴信息结构 PublicPartner_NameAsString'伙伴姓名 PublicPartner_AgeAsInteger'伙伴年龄 PublicPartner_Sex_is_MaleAsBoolean'伙伴性别 EndStructure PublicPartnerAsPartnerInfo'伙伴 PublicAchievementAsString() '''<summary> '''构造函数 '''</summary> '''<paramname="isDefault">true:使用默认值,false:使用测试值</param> '''<remarks></remarks> PublicSubNew(OptionalByValisDefaultAsBoolean=True) Me.Name=IIf(isDefault,"","Tsybius") Me.Age=IIf(isDefault,23) Me.Sex_is_Male=IIf(isDefault,True,True) Me.Partner.Partner_Name=IIf(isDefault,"Galatea") Me.Partner.Partner_Age=IIf(isDefault,21) Me.Partner.Partner_Sex_is_Male=IIf(isDefault,False) Me.Achievement=IIf(isDefault,NewString(){},NewString(){"ach1","ach2","ach3"}) EndSub EndClass
SubMain() '将测试内容写入到文件test.txt中 JsonXmlHelper.WriteToFile("test.txt","这是一段测试内容") '从文件test.txt中读入内容 Console.WriteLine(JsonXmlHelper.ReadFromFile("test.txt")) Console.WriteLine() '建立Person结构实例 DimpAsPerson=NewPerson(False) '将Person类型实例存储到json格式的字符串中(两种格式:不缩进、缩进) Dimjson1AsString= JsonConvert.SerializeObject(p,Newtonsoft.Json.Formatting.None) Dimjson2AsString= JsonConvert.SerializeObject(p,Newtonsoft.Json.Formatting.Indented) '输出生成的字符串 Console.WriteLine(json1&vbCrLf&vbCrLf&json2) JsonXmlHelper.WriteJsonToXml("x.xml",json1) Console.ReadLine() EndSub
3)运行结果
控制台输出结果
<?xmlversion="1.0"encoding="gb2312"?> <!--这个XML文档中存储了一个JSON格式的信息--> <Root> <NameType="String"Value="Tsybius"/> <AgeType="Integer"Value="23"/> <Sex_is_MaleType="Boolean"Value="True"/> <PartnerType="Object"> <Partner_NameType="String"Value="Galatea"/> <Partner_AgeType="Integer"Value="21"/> <Partner_Sex_is_MaleType="Boolean"Value="False"/> </Partner> <AchievementType="Array"Value0="ach1"Value1="ach2"Value2="ach3"/> </Root>
END