栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Visual Basic .NET中反序列化JSON

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Visual Basic .NET中反序列化JSON

您可以做的是创建一个

JsonConverter
,以正确的顺序将您的
Actor
类序列化为
IEnumerable<object>
,然后在反序列化中使用LINQ
to
JSON

读取JSON,检查所读取的令牌是否为数组,然后以等效顺序设置属性。

您可以为您的

Actor
类对此进行硬编码,但是我认为创建一个通用转换器会更有趣,该通用转换器使用POCO类型的属性顺序将不可枚举的POCO往返于JSON数组。可以使用
<JsonProperty(Order:=NNN)>
属性在您的班级中指定此顺序。

因此,转换器:

Public Class ObjectToArrayConverter(Of T)    Inherits JsonConverter    Public Overrides Function CanConvert(objectType As Type) As Boolean        Return GetType(T) = objectType    End Function    Private Shared Function ShouldSkip(p As JsonProperty) As Boolean        Return p.Ignored Or Not p.Readable Or Not p.Writable    End Function    Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)        If value Is Nothing Then writer.WriteNull()        Else Dim type = value.GetType() Dim contract = TryCast(serializer.ContractResolver.ResolveContract(type), JsonObjectContract) If contract Is Nothing Then     Throw New JsonSerializationException("invalid type " & type.FullName) End If Dim list = contract.Properties.Where(Function(p) Not ShouldSkip(p)).Select(Function(p) p.ValueProvider.GetValue(value)) serializer.Serialize(writer, list)        End If    End Sub    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object        If reader.TokenType = JTokenType.Null Then Return Nothing        End If        Dim token = JArray.Load(reader)        Dim contract = TryCast(serializer.ContractResolver.ResolveContract(objectType), JsonObjectContract)        If contract Is Nothing Then Throw New JsonSerializationException("invalid type " & objectType.FullName)        End If        Dim value = If(existingValue, contract.DefaultCreator()())        For Each pair In contract.Properties.Where(Function(p) Not ShouldSkip(p)).Zip(token, Function(p, v) New With { Key.Value = v, Key.Property = p }) Dim propertyValue = pair.Value.ToObject(pair.Property.PropertyType, serializer) pair.Property.ValueProvider.SetValue(value, propertyValue)        Next        Return value    End FunctionEnd Class

和你的班级:

<JsonConverter(GetType(ObjectToArrayConverter(Of Actor)))> _Public Class Actor    ' Use [JsonProperty(Order=x)] //http://www.newtonsoft.com/json/help/html/JsonPropertyOrder.htm to explicitly set the order of properties    <JsonProperty(Order := 0)> _    Public Property Name As String    <JsonProperty(Order := 1)> _    Public Property NumberOfMovies As Integer    <JsonProperty(Order := 2)> _    Public Property NumberOfAwards As Integer    <JsonProperty(Order := 3)> _    Public Property NumberOfTVshows As IntegerEnd Class

工作提琴。

请注意,

JsonConverter
可以在此处找到处理适用于属性的属性的更新的c#版本。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616876.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号