VB.NET 將JSON格式的字符串保存到XML文件中

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

相關文章
相關標籤/搜索