2016-08-09 159 views
0

Ich habe ein Problem, wenn Deserialisieren diesen json string:Deserialisieren JSON Text mit Array von innen in Visual Basic webservice

{ 
"UserName": "Person1", 
"TechOpinion": "Under Repair", 
"CodeStatus": "0", 
"DateYear": "2016", 
"TechCode": "Person2", 
"CReception": [{ 
    "CodeRecep": "146001" 
}, { 
    "CodeRecep": "146002" 
}, { 
    "CodeRecep": "146003" 
}, { 
    "CodeRecep": "146004" 
}] 
} 

ich eine gespeicherte Prozedur mit Root-Wert und einen der CodeRecep Werte jedes Mal aufgerufen werden soll (nach Anzahl in zwei getrennten Class-Dateien
erste von CodeRecep die gespeicherte Prozedur ruft Werte {{4 mal in dieser Probe}})
ich zwei Klasse für json Typ schreiben Wurzel Werte wie folgt zu halten:

Public Class ArrayJSONParameter 
Dim _UserName As String 
Dim _TechOpinion As String 
Dim _CodeStatus As String 
Dim _DateYear As String 
Dim _TechCode As String 
Dim _CReception As CodeReceptions 



Public Property UserName() As String 
    Get 
     Return _UserName 
    End Get 
    Set(ByVal value As String) 
     _UserName = value 
    End Set 
End Property 
Public Property TechOpinion() As String 
    Get 
     Return _TechOpinion 
    End Get 
    Set(ByVal value As String) 
     _TechOpinion = value 
    End Set 
End Property 
Public Property CodeStatus() As String 
    Get 
     Return _CodeStatus 
    End Get 
    Set(ByVal value As String) 
     _CodeStatus = value 
    End Set 
End Property 
Public Property DateYear() As String 
    Get 
     Return _DateYear 
    End Get 
    Set(ByVal value As String) 
     _DateYear = value 
    End Set 
End Property 
Public Property TechCode() As String 
    Get 
     Return _TechCode 
    End Get 
    Set(ByVal value As String) 
     _TechCode = value 
    End Set 
End Property 
Public Property CReception() As CodeReceptions 
    Get 
     Return _CReception 
    End Get 
    Set(ByVal value As CodeReceptions) 
     _CReception = value 
    End Set 
End Property 


End Class 

und die zweite innerhalb Array wie folgt zu halten:

Public Class CodeReceptions 
Dim _CodeRece As String 
Public Property CodeRecep() As String 
    Get 
     Return _CodeRece 
    End Get 
    Set(ByVal value As String) 
     _CodeRece = value 
    End Set 
End Property 
End Class 

mein Haupt-Code-Methode in webservice ist:

<WebMethod()> _ 
Public Function JsonSample(ByVal jsonTxt As String) As String 
    Dim _JSONArray As ArrayJSONParameter = JsonConvert.DeserializeObject(Of ArrayJSONParameter)(jsonTxt) 

    Return "sample text" '_JSONArray.UserName 
End Function 

aber wenn ich versuche ich den Webservice mit meinem JSON-String auszuführen i Gesicht diesen Fehler:

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'CodeReceptions' because the type requires a JSON object (e.g. {&quot;name&quot;:&quot;value&quot;}) to deserialize correctly. 
    To fix this error either change the JSON to a JSON object (e.g. {&quot;name&quot;:&quot;value&quot;}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List&lt;T&gt; that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. 
    Path 'CReception', line 1, position 119. 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 823 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 848 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 293 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 1018 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 2393 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 485 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 291 
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 196 
     at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonSerializer.cs:line 823 
     at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonConvert.cs:line 863 
     at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonConvert.cs:line 820 
     at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value) in C:\Development\Releases\Json\Working\Newtonsoft.Json\Working-Signed\Src\Newtonsoft.Json\JsonConvert.cs:line 757 
     at JSONWS.JsonSample(String jsonTxt) 

i verbringen zwei Tage Deserialisieren Fäden in Internet, aber ähnliche Threads verwenden einfachen json Text aber mein Problem ist, innerhalb des Arrays zu lesen. Ich kann nicht die richtige Antwort finden, bitte helfen Sie mir dabei. Warum bekomme ich diesen Fehler? und neben, wie kann ich auf interne Array-Werte im Code zugreifen?

Antwort

0

Ihre CReception Eigenschaft muss ein Array von CodeReceptions kein einziger CodeReceptions sein:

Dim _CReception As CodeReceptions() 
'... 
Public Property CReception() As CodeReceptions() 
    Get 
     Return _CReception 
    End Get 
    Set(ByVal value As CodeReceptions()) 
     _CReception = value 
    End Set 
End Property 

Es könnte ein List(Of CodeReceptions) sein statt, wenn Sie es vorziehen.

+0

thnx viel Mark. du rettest mein Leben! Ich bin wirklich dank Ihrer Reaktionszeit und JA mein Code funktioniert gut. Bitte helfen Sie mir mehr bei der Auswahl von Array oder Liste. Was ist deiner Meinung nach in meinem Fall besser? –

+0

Wenn Sie Elemente zur 'CReception'-Sammlung hinzufügen, würde ich eine' List' verwenden. Wenn nicht, liegt es wahrscheinlich an den persönlichen Vorlieben. Persönlich verwende ich fast immer Listen anstelle von Arrays. – Mark

+0

danke Mark. Ich denke, dass ich in Zukunft einige Artikel hinzufügen muss, aber nicht jetzt. aber es ist besser, dass ich ab jetzt ein Element anstelle eines Arrays verwende. Danke für den Erfahrungsaustausch. –