【问题标题】:Convert Custom JSON Object to a VB.NET Object将自定义 JSON 对象转换为 VB.NET 对象
【发布时间】:2012-04-05 06:45:26
【问题描述】:

我有一个像这样的 JSON 对象。

{
 "Errors":{
   "err1":[
     //* Array of err1 objects
   ],
   "err2":[
     //* Array of err2 objects
   ]
 }
}

我使用此对象报告在对 PHP 页面的请求中发现的错误。

我想将该对象转换为基本上像这样声明的 vb.Net 对象:

Public Class WebErrContainer
  Public Errors as List(Of IWebError)
End Class

Public Class Err1
  Implements IWebError
End Class

Public Class Err2
  Implements IWebError
End Class

Public Interface IWebError
End Interface

我不知道我的实现是否足够好,我对 vb.net 比较陌生,所以我现在在 OOP 方面的技能有点低。

就是这样......我想我已经尽可能地解释了情况。

如果您需要更多信息,我会提供。

提前感谢您提供的任何帮助。谢谢。

PD:我目前正在使用 Newtonsoft 的 JSON.Net 库。随意推荐一些其他库或方法来处理 VB.NET 中的 JSON。


我通过这样做解决了这个问题:

Public Sub New(ByVal jsonText As String)
    Dim jObject As JObject = jObject.Parse(jsonText )
    Dim jErrors As JToken = jObject("Errors")
    Dim jS = New JsonSerializer()

    ' This is the "temporal" dictionary that stores the errors like they are 
    ' stored in JSON
    Dim jsErrs As New Dictionary(Of String, List(Of Object))

    ' List that is going to be passed to the "Errors" field in the class
    Dim lErrors As New List(Of IWebError)



    jsErrs = jS.Deserialize(New JTokenReader(jErrors ), jsErrs .GetType)
    If Not jsErrs Is Nothing Then
        For Each errType As KeyValuePair(Of String, List(Of Object)) In jsErrs 
            For Each Err As Object In errType.Value
                lErrors .Add(jS.Deserialize(New JTokenReader(Err), Type.GetType(errType.Key)))
            Next
        Next
    End If
    Me.Errors = lErrors
End Sub

【问题讨论】:

  • 我添加了一个我提出的解决方案...请随时报告代码中发现的任何错误。感谢 svick 和 Jayesh 的回答...

标签: .net vb.net json visual-studio-2010 json.net


【解决方案1】:

可能最简单的解决方案是将Errors 设置为基于Err1Err2 计算的只读属性:

Public Class WebErrContainer
  Public Readonly Property Errors as List(Of IWebError)
    Get
      Return (Ctype(Err1, IEnumerable(Of IWebError))).Concat(Err2).ToList
    End Get
  End Property

  Public Err1 as List(Of Err1)
  Public Err2 as List(Of Err2)
End Class

【讨论】:

  • 我不仅有这两种类型的错误,这个解决方案对我没有帮助,我在主帖上发布了一个解决方案。
【解决方案2】:

您可以使用 Deserialize 自动为您执行此操作,还是发生了一些奇怪的事情。我用过 Newtsonsoft,我是这样做的(在 c# 中)

JsonConvert.DeserializeObject(Of MyJsonFromPHP)(jsonResponseText)

Public Class MyJsonFromPHP
     Public Property Errors as ErrorCollection
End Class

Public Class ErrorCollection
    Public Property err1 As List(Of Err1)
    Public Property err2 As List(Of Err2)
End Class

Public Class Err1
    Public Property code as Integer
    Public Property message as String
End Class

【讨论】:

    【解决方案3】:

    我认为这可能会对您有所帮助。 这里 strJSON 是你的 JSON 字符串

    Dim jsS As New JavaScriptSerializer : objPostData = jsS.DeserializeObject(strJSON)
    

    之后你可以像这样迭代

    For Each objTop As Object In objPostData
                    objDic = CType(objTop, Generic.Dictionary(Of String, Object))
                    dim strError  as string = objDic.Item("Errors")
    Next
    

    如果你还想要什么,请告诉我

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 1970-01-01
      • 2011-01-15
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2023-03-11
      相关资源
      最近更新 更多