2014-11-14 4 views
0

У меня есть строка JSON. который имеет такую ​​форму:JSON deserialize with array и non-Array

"Result": { 
     "AdditionalInfo": { 
     "SubCategoryID": "978", 
     "SellerPartNumber": "04-VO7T-14PP", 
     "ManufacturerPartNumberOrISBN": "04-VO7T-14PP", 
     "UPC": null 
     }, 
     "ErrorList": { 
     "ErrorDescription": [ 
      { 
      "#cdata-section": "Error(s). Item not created." 
      }, 
      { 
      "#cdata-section": "Error:[Item does not exist. Please create a new list.]" 
      } 
     ] 
     } 
    } 

Однако иногда эта часть также является массивом. как

"Result": [ 
     { 
     "AdditionalInfo": { 
      "SubCategoryID": "1512", 
      "SellerPartNumber": "TY-SZT1-358V", 
      "ManufacturerPartNumberOrISBN": "TY-SZT1-358V", 
      "UPC": null 
     }, 
     "ErrorList": { 
      "ErrorDescription": [ 
      { 
       "cdata-section": "Error(s). Item not created." 
      }, 
      { 
       "cdata-section": "CufflinkMaterial - Property: [CufflinkMaterial] value error. The submitted value: [MPS.Domain.SubCategoryProperty] is not recognized for this property." 
      }, 
      { 
       "cdata-section": "CufflinkType - Property: [CufflinkType] value error. The submitted value: [MPS.Domain.SubCategoryProperty] is not recognized for this property." 
      } 
      ] 
     } 
     }, 
     { 
     "AdditionalInfo": { 
      "SubCategoryID": "1512", 
      "SellerPartNumber": "UF-T05C-T6XG", 
      "ManufacturerPartNumberOrISBN": "UF-T05C-T6XG", 
      "UPC": null 
     }, 
     "ErrorList": { 
      "ErrorDescription": [ 
      { 
       "cdata-section": "Error(s). Item not created." 
      }, 
      { 
       "cdata-section": "CufflinkMaterial - Property: [CufflinkMaterial] value error. The submitted value: [MPS.Domain.SubCategoryProperty] is not recognized for this property." 
      }, 
      { 
       "cdata-section": "CufflinkType - Property: [CufflinkType] value error. The submitted value: [MPS.Domain.SubCategoryProperty] is not recognized for this property." 
      } 
      ] 
     } 
     }, 
     { 
     "AdditionalInfo": { 
      "SubCategoryID": "1512", 
      "SellerPartNumber": "5B-1137-WT3O", 
      "ManufacturerPartNumberOrISBN": "5B-1137-WT3O", 
      "UPC": null 
     }, 
     "ErrorList": { 
      "ErrorDescription": [ 
      { 
       "cdata-section": "Error(s). Item not created." 
      }, 
      { 
       "cdata-section": "CufflinkMaterial - Property: [CufflinkMaterial] value error. The submitted value: [MPS.Domain.SubCategoryProperty] is not recognized for this property." 
      }, 
      { 
       "cdata-section": "CufflinkType - Property: [CufflinkType] value error. The submitted value: [MPS.Domain.SubCategoryProperty] is not recognized for this property." 
      } 
      ] 
     } 
     } 

      ] 

Есть общий способ, которым я могу Deserlize как JSON без определения различных объектов? Так что, я определяю массив объекта Result, и когда есть единственный объект, он создаст один индекс в массиве объектов, а когда его будет несколько, он может создать несколько индексов в массиве.

Конечная цель - использовать объект-объект и использовать его для синтаксического анализа как одного объекта результата, так и множества.

Возможно ли это? благодаря Sameers

+1

Какие сериализатору вы используете? Это возможно с помощью [Json.Net] (http://james.newtonking.com/json), используя «JsonConverter». См. [Этот вопрос] (http://stackoverflow.com/q/18994685/10263) для решения на C#. Вы должны перевести его на vb.net. –

ответ

0

Благодаря Брайан Роджерс

Ответ был в вашей ссылке.

How to handle both a single item and an array for the same property using JSON.net

я преобразовал, что в VB.NET, используя этот код.

Class SingleOrArrayConverter(Of T) 
    Inherits Newtonsoft.Json.JsonConverter 
    Public Overrides Function CanConvert(ByVal objectType As Type) As Boolean 
     'Return (objectType = GetType(List(Of T))) 
     Return objectType.Equals(GetType(Generic.List(Of T))) 
    End Function 

    Public Overrides Function ReadJson(ByVal reader As Newtonsoft.Json.JsonReader, ByVal objectType As Type, ByVal existingValue As Object, ByVal serializer As Newtonsoft.Json.JsonSerializer) As Object 
     Dim token As Newtonsoft.Json.Linq.JToken = Newtonsoft.Json.Linq.JToken.Load(reader) 
     If token.Type = Newtonsoft.Json.Linq.JTokenType.Array Then 
      Return token.ToObject(Of Generic.List(Of T))() 
     End If 
     Dim list As New Generic.List(Of T) 
     list.Add(token.ToObject(Of T)()) 
     Return list 
    End Function 

    Public Overrides ReadOnly Property CanWrite() As Boolean 
     Get 
      Return False 
     End Get 
    End Property 

    Public Overrides Sub WriteJson(ByVal writer As Newtonsoft.Json.JsonWriter, ByVal value As Object, ByVal serializer As Newtonsoft.Json.JsonSerializer) 
     Throw New NotImplementedException() 
    End Sub 
End Class 

и применил этот атрибут к определению моих данных.

<Newtonsoft.Json.JsonProperty("Result")> _ 
    <Newtonsoft.Json.JsonConverter(GetType(Utilities.JSONUtilities.SingleOrArrayConverter(Of FeedResultType)))> _ 
    Public Property Result() As Generic.List(Of FeedResultType) 
     Get 
      Return m_Result 
     End Get 
     Set(ByVal value As Generic.List(Of FeedResultType)) 
      m_Result = value 
     End Set 
    End Property 

и все его хорошее сейчас. благодаря Sameers

Да, я использую библиотеку NewtonSoft