0

このような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
4

3 に答える 3

1

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
于 2012-04-11T10:25:15.847 に答える
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
于 2012-04-05T07:05:46.353 に答える
0

これはあなたを助けるかもしれないと思います。ここで 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

他に欲しいものがあれば教えてください

于 2012-04-05T07:20:53.273 に答える