【问题标题】:VB.net JSON DeserializeVB.net JSON 反序列化
【发布时间】:2011-12-28 09:58:25
【问题描述】:

我有以下 JSON 字符串要反序列化:

[{"application_id":"1","application_package":"abc"},{"application_id":"2","application_package":"xyz"}]

我正在使用 DataContractJsonSerializer 方法。

它由项目数组组成,我找不到使用 VB.Net 可以反序列化此结构的示例。我有以下应用程序类来存储这些信息:

    <DataContract(Namespace:="")> _
    Public Class ApplicationItem

    <DataMember(Name:="application_id")>
    Public Property application_id As String

    <DataMember(Name:="application_package")>
    Public Property application_package As String

    End Class

【问题讨论】:

    标签: json vb.net deserialization


    【解决方案1】:

    这对我有用:

    // Get the HttpWebRequest reaponse
    string Response = loResponseStream.ReadToEnd();
    
    var jss = new JavaScriptSerializer();
    var dict = jss.Deserialize<Dictionary<string, dynamic>>(Response);
    string carrier = (dict["Response"]["carrier"]);
    

    【讨论】:

      【解决方案2】:

      这是将 JSON 反序列化为对象的最简单方法(使用 .NET 4):

      示例 JSON:

      {
          "dogs":[],
          "chickens":[
              {
                  "name":"Macey",
                  "eggs":7
              }, 
              {
                  "name":"Alfred",
                  "eggs":2
              }
          ]
      }
      

      VB.NET:

      Try
          Dim j As Object = New JavaScriptSerializer().Deserialize(Of Object)(JSONString)
          Dim a = j("dogs")                   ' returns empty Object() array
          Dim b = j("chickens")(0)            ' returns Dictionary(Of String, Object)
          Dim c = j("chickens")(0)("name")    ' returns String "Macey"
          Dim d = j("chickens")(1)("eggs")    ' returns Integer 2
      Catch ex As Exception
          ' in case the structure of the object is not what we expected.
      End Try
      

      【讨论】:

      • 虽然 Abdul 的回答更完整,但这确实是以快速而肮脏的方式访问 JSON 数据的最简单方法(例如来自 API 响应的小型、可预测的集合)。
      • 哇,这真的帮了我大忙,我一直在寻找快速简单的东西,而你做到了!!!
      【解决方案3】:

      我建议您使用 JavaScriptSerializer 而不是 DataContractJsonSerializer。原因是:

      • JavaScriptSerializerDataContractJsonSerializer 更快
      • 对于简单的序列化,DataContractJsonSerializer 需要比 JavaScriptSerializer 更多的代码。

      您不需要DataContractDataMember 属性与JavaScriptSerializer 一起使用

      使用这个数据类

      <Serializable> _
      Public Class ApplicationItem
          Public Property application_id() As String
              Get
                  Return m_application_id
              End Get
              Set
                  m_application_id = Value
              End Set
          End Property
          Private m_application_id As String
          Public Property application_package() As String
              Get
                  Return m_application_package
              End Get
              Set
                  m_application_package = Value
              End Set
          End Property
          Private m_application_package As String
      End Class
      

      并使用它来反序列化您的jsonText

      Dim jss As New JavaScriptSerializer()
      Dim dict = jss.Deserialize(Of List(Of ApplicationItem))(jsonText)
      

      如果还想使用DataContractJsonSerializer,可以使用下面这段代码进行反序列化:

      Dim obj As New List(Of ApplicationItem)()
      Dim ms As New MemoryStream(Encoding.Unicode.GetBytes(json))
      Dim serializer As New System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.[GetType]())
      obj = DirectCast(serializer.ReadObject(ms), List(Of ApplicationItem))
      ms.Close()
      ms.Dispose()
      

      礼貌:使用Telerik Code Converter

      【讨论】:

      • 完美运行。也感谢您显示代码转换器的链接。
      • 我不熟悉 VB.NET 语法,经常使用它来将 C# 代码转换为 VB.NET :)
      • 酷,感谢您的提示!使用 JavaScriptSerializer 真的很简单
      • 如果 JavaScriptSerializer 比 DataContractJsonSerializer 快,为什么 json.net 在他们的 website 上宣传自己“比 DataContractJsonSerializer 快 50%,比 JavaScriptSerializer 快 250%”?
      • @mijiturka 尽管 JSON.NET 在那个年代有可接受的基础,但可能不如今天那么多。如果我今天回答了这个问题,我会使用 JSON.NET :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多