【问题标题】:Deserializing JSON text with inside's Array in Visual basic webservice在 Visual Basic Web 服务中使用内部数组反序列化 JSON 文本
【发布时间】:2016-08-09 15:20:02
【问题描述】:

我在反序列化这个 json 字符串时遇到问题:

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

我想每次都调用具有根值和 CodeRecep 值之一的存储过程(按 CodeRecep 值的数量,存储过程将调用 {{此示例中的 4 次}})
我在两个单独的 .class 文件中为 json 类型编写了两个类
第一个保存根值如下:

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

第二个存放在数组中,如下所示:

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

我在webservice中的主要方法代码是:

<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

但是当我尝试使用我的 json 字符串执行 web 服务时,我遇到了这个错误:

    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)

我花了两天时间阅读互联网上的反序列化线程,但类似的线程使用简单的 json 文本,但我的问题是内部数组。 我找不到正确的答案,所以请帮助我。 为什么我得到那个错误?以及如何在代码中访问内部数组值?

【问题讨论】:

    标签: arrays json vb.net web-services json-deserialization


    【解决方案1】:

    您的CReception 属性必须是CodeReceptions 的数组,而不是单个CodeReceptions

    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
    

    如果您愿意,也可以改为 List(Of CodeReceptions)

    【讨论】:

    • 非常感谢马克。你救了我的命!我真的很感谢您的响应时间,是的,我的代码工作正常。请帮助我更多地选择数组或列表。在你看来,哪一个对我来说更好。
    • 如果您要将项目添加到 CReception 集合中,我会使用 List。如果不是,那可能取决于个人喜好。就个人而言,我几乎总是使用列表而不是数组。
    • 谢谢马克。我想我将来需要添加一些项目,但不是现在。但我最好从现在开始使用 item 而不是数组。感谢分享经验。
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多