【问题标题】:Deserialize JSON object which has property name as number into a object in VB.NET将属性名称为数字的 JSON 对象反序列化为 VB.NET 中的对象
【发布时间】:2019-05-23 14:59:54
【问题描述】:

我有下面的 JSON 对象

myvalues : {
     0 : "value0",
     1 : "value1",
     2 : "value2",
     3 : "value3"
}

我想将此 JSON 对象绑定到 vb.net 类对象中,作为 WCF OperationContract 方法的输入 - 但我无法将数字属性名称定义为数字。我收到错误消息:

属性名称需要标识符,因为属性名称不能是数字

使用以下内容:

Public class myvalues_class

    public property 0 as string
    public property 1 as string
    public property 2 as string
    public property 3 as string

end class

如何将此 JSON 对象转换为 vb.net 对象类?

【问题讨论】:

  • 看起来更像是字典而不是属性列表。如果你真的想要属性,你可以看看 DataContract
  • 您可以将myvalues 反序列化为Dictionary(Of Integer, String) 或将<JsonProperty("N")> 属性添加到myvalues_class 中的属性,如How can I parse a JSON string that would cause illegal C# identifiers?。这个问题是针对 c# 的,但同样的答案也适用。同意这是重复的吗?
  • 很高兴为您提供帮助,无需道歉 - 您的问题很明确,并且没有 vb.net 重复项。 但无法将 JSON 属性 0 反序列化为 VB.NET 类属性 0。 - 你还有问题吗?
  • 看起来效果很好,见dotnetfiddle.net/fvR9ED
  • 或者你没有使用json.net?你用的是什么序列化器?可以分享minimal reproducible example吗?

标签: json vb.net wcf object properties


【解决方案1】:

使用DataContractJsonSerializer,因此您需要使用data contract attributes 注释您的Values 类型,将一些有效命名的vb.net 属性映射到JSON 数字属性名称,例如像这样:

<System.Runtime.Serialization.DataContract> _
Public Class Values
    <DataMember(Name:="0")> _
    Public Property r As Integer

    <DataMember(Name:="1")> _
    Public Property g As Integer

     <DataMember(Name:="2")> _
    Public Property b As Integer

    <DataMember(Name:="3")> _
    Public Property a As Integer
End Class

请注意,数据协定序列化程序是 opt-in,因此您必须将 所有 属性标记为使用 DataMemberAttribute 进行序列化。

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 2012-03-01
    • 2014-08-22
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多