1.關於本文json
這幾天打算寫一個工具類JsonXmlHelper,用來進行用XML來保存JSON格式文件的工做。該工具類中要實現2個最主要的函數:數組
1)將JSON格式的內容寫入到地址爲address的XML中:WriteJsonToXml函數
2)把函數1中構造的XML文件恢復成JSON格式文檔:RecoverJsonFromXml工具
函數1的實現將在本文中給出,函數2的實現將在下一篇博文中給出測試
2.代碼說明spa
1)添加引用:Newtonsoft.Json.dll
.net
2)導入庫code
'JSON解析相關函數,須要添加引用Newtonsoft.Json.dll Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq 'XMl解析相關函數 Imports System.Xml
3)在模塊ModuleTest中創建類JsonXmlHelperorm
4)兩個基礎函數:xml
WriteToFile(將一個字符串的內容寫入到文件)
ReadFromFile(從文件中讀取內容賦值到一個字符串)
''' <summary> ''' 將字符串中內容寫入到文件 ''' </summary> ''' <param name="address">文件地址</param> ''' <param name="content">被寫入文件的字符串</param> ''' <remarks></remarks> Public Shared Sub WriteToFile(address As String, content As String) Try Dim sw As IO.StreamWriter sw = New IO.StreamWriter(address, False, System.Text.Encoding.UTF8) sw.Write(content) sw.Close() sw.Dispose() Catch ex As Exception Throw New Exception(ex.Message) End Try End Sub ''' <summary> ''' 從文件中讀取信息到字符串 ''' </summary> ''' <param name="address">文件地址</param> ''' <returns>讀取到的字符串</returns> ''' <remarks></remarks> Public Shared Function ReadFromFile(address As String) Try Dim sr As IO.StreamReader sr = IO.File.OpenText(address) Return sr.ReadToEnd() Catch ex As Exception Throw New Exception(ex.Message) End Try End Function
5)函數WriteJsonToXml的實現
''' <summary> ''' 將JSON格式的內容寫入到地址爲address的XML中 ''' </summary> ''' <param name="address">要存入的文件地址</param> ''' <param name="json">源JSON字符串</param> ''' <remarks></remarks> Public Shared Sub WriteJsonToXml(address As String, json As String) '若是存在同名文件則先刪除 If IO.File.Exists(address) Then IO.File.Delete(address) End If '創建XML文檔 Dim writer As XmlTextWriter = New XmlTextWriter(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文檔建立結束 End Sub ''' <summary> ''' 將一段JSON格式字符串寫入到XML文件中 ''' </summary> ''' <param name="writer"></param> ''' <param name="json"></param> ''' <remarks></remarks> Private Shared Sub WriteToXml(writer As XmlTextWriter, json As String) Dim jobj As JObject = JObject.Parse(json) '遍歷讀取到的JSON字符串 For Each jtemp As JProperty In jobj.Children '根據讀入的不一樣數據類型分類討論 'Console.WriteLine(jtemp.Name.ToString & " " & jtemp.Value.ToString) Select Case jtemp.Value.Type Case JTokenType.Object writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "Object") WriteToXml(writer, jtemp.Value.ToString) writer.WriteEndElement() Case JTokenType.Array writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "Array") '遍歷數組讀取值 For i As Integer = 0 To jtemp.Value.Count - 1 writer.WriteAttributeString("Value" & i, jtemp.Value(i).ToString) Next writer.WriteEndElement() Case JTokenType.String writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "String") writer.WriteAttributeString("Value", jtemp.Value.ToString) writer.WriteEndElement() Case JTokenType.Boolean writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "Boolean") writer.WriteAttributeString("Value", jtemp.Value.ToString) writer.WriteEndElement() Case JTokenType.Integer writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "Integer") writer.WriteAttributeString("Value", jtemp.Value.ToString) writer.WriteEndElement() Case JTokenType.Float writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "Float") writer.WriteAttributeString("Value", jtemp.Value.ToString) writer.WriteEndElement() Case JTokenType.Null writer.WriteStartElement(jtemp.Name.ToString(), "") writer.WriteAttributeString("Type", "Null") writer.WriteAttributeString("Value", jtemp.Value.ToString) writer.WriteEndElement() Case Else End Select Next End Sub
3.上面若干函數的調用示例
1)創建結構Person
Public Class Person Public Name As String '姓名 Public Age As Integer '年齡 Public Sex_is_Male As Boolean '性別 Public Structure PartnerInfo '夥伴信息結構 Public Partner_Name As String '夥伴姓名 Public Partner_Age As Integer '夥伴年齡 Public Partner_Sex_is_Male As Boolean '夥伴性別 End Structure Public Partner As PartnerInfo '夥伴 Public Achievement As String() ''' <summary> ''' 構造函數 ''' </summary> ''' <param name="isDefault">true:使用默認值,false:使用測試值</param> ''' <remarks></remarks> Public Sub New(Optional ByVal isDefault As Boolean = True) Me.Name = IIf(isDefault, "", "Tsybius") Me.Age = IIf(isDefault, 0, 23) Me.Sex_is_Male = IIf(isDefault, True, True) Me.Partner.Partner_Name = IIf(isDefault, "", "Galatea") Me.Partner.Partner_Age = IIf(isDefault, 0, 21) Me.Partner.Partner_Sex_is_Male = IIf(isDefault, True, False) Me.Achievement = IIf(isDefault, New String() {}, New String() {"ach1", "ach2", "ach3"}) End Sub End Class
2)在Main函數中調用本文中的函數
Sub Main() '將測試內容寫入到文件test.txt中 JsonXmlHelper.WriteToFile("test.txt", "這是一段測試內容") '從文件test.txt中讀入內容 Console.WriteLine(JsonXmlHelper.ReadFromFile("test.txt")) Console.WriteLine() '創建Person結構實例 Dim p As Person = New Person(False) '將Person類型實例存儲到json格式的字符串中(兩種格式:不縮進、縮進) Dim json1 As String = JsonConvert.SerializeObject(p, Newtonsoft.Json.Formatting.None) Dim json2 As String = JsonConvert.SerializeObject(p, Newtonsoft.Json.Formatting.Indented) '輸出生成的字符串 Console.WriteLine(json1 & vbCrLf & vbCrLf & json2) JsonXmlHelper.WriteJsonToXml("x.xml", json1) Console.ReadLine() End Sub
3)運行結果
控制檯輸出結果
生成的x.xml內容
<?xml version="1.0" encoding="gb2312"?> <!--這個XML文檔中存儲了一個JSON格式的信息--> <Root> <Name Type="String" Value="Tsybius" /> <Age Type="Integer" Value="23" /> <Sex_is_Male Type="Boolean" Value="True" /> <Partner Type="Object"> <Partner_Name Type="String" Value="Galatea" /> <Partner_Age Type="Integer" Value="21" /> <Partner_Sex_is_Male Type="Boolean" Value="False" /> </Partner> <Achievement Type="Array" Value0="ach1" Value1="ach2" Value2="ach3" /> </Root>
END