【问题标题】:Newsoft JSON .NET Deserializing to an Object with Private Properties in VB.netNewsoft JSON .NET 反序列化为 VB.net 中具有私有属性的对象
【发布时间】:2017-03-02 15:14:33
【问题描述】:

我目前正在编写一个 API,它从使用 Newsoft JSON .NET 库在 VB.net 中处理它的 Web 服务中获取对象。

我正在将名为 Vehicles 的 JSON 数组反序列化为车辆列表。

这里是重要的代码sn-ps:

Public Class VehicleList
    Public Vehicles() As Vehicle
End Class

Public Class Vehicle
    Public Property licence_plate_number As String
End Class

这里我们有一个 Web 客户端,它抓取 json 并将其放入对象中。

Public Class dcVehicles

    Private Property _Vehicles As VehicleList

    Public ReadOnly Property Vehicle As Vehicle()
        Get
            Return _Vehicles.Vehicles
        End Get
    End Property

    Public Sub Refresh()
        _Vehicles = JsonConvert.DeserializeObject(Of VehicleList)(wcReply, jsSettings)
    End Sub
End Class

还有更多内容(减少)。 所以一切都按预期工作,json net 正在创建一系列车辆。

我正在尝试通过将车辆类中的属性设置为私有和只读来实现这一点,使用 api 的应用程序应该无法设置这些。

问题是我尝试更改车辆类中的公共属性以保持属性私有并允许只读,如下所示:

Public Class Vehicle
    Friend Property licence_plate_number As String

    Public ReadOnly Property RegistrationNumber As String
        Get
            Return licence_plate_number
        End Get
    End Property
End Class

然后我得到的问题是 JSON.net 无法填充车辆。所有 3 个类都在同一个命名空间中。 所以我尝试了使用 Friend/private 访问级别修饰符的 licence_plate_number,但 Json 网络仍然无法填充该对象。

唯一的办法就是保持公开。

有人有解决方法的想法吗?还是我错过了一些简单的东西?

谢谢

【问题讨论】:

  • 你能提供一个json的样本吗?
  • 反正不能直接序列化私有成员。但是有一些解决方案,请参阅 (C#) stackoverflow.com/questions/10189471/…, stackoverflow.com/questions/32008869/…
  • 你想在 Vehicle 的 JSON 中看到什么? RegistrationNumberlicence_plate_number?
  • 感谢您的帮助,我可以添加一个json的示例。 json 有 licence_plate_number 但我想将它存储在只读属性 RegistrationNumber 中。

标签: vb.net serialization json.net access-modifiers


【解决方案1】:

如果您只想使用 Json.NET 序列化 PrivateFriend 属性,请将其标记为 <JsonProperty> 并将您不想序列化的公共只读属性标记为 <JsonIgnore>

Public Class Vehicle
    <JsonProperty> _
    Friend Property licence_plate_number As String

    <JsonIgnore> _
    Public ReadOnly Property RegistrationNumber As String
        Get
            Return licence_plate_number
        End Get
    End Property
End Class

演示fiddle.

但是如果你真的想要 licence_plate_number 属性的只读值语义以便在构造后无法设置它,你可以通过将默认构造函数替换为单个参数化构造函数并匹配构造函数参数来做到这一点JSON 属性名称的名称,如下所示:

Public Class Vehicle
    Private Readonly licence_plate_number As String

    Public Sub New(ByVal licence_plate_number as String)
        Me.licence_plate_number = licence_plate_number
    End Sub

    <JsonProperty("licence_plate_number")> _
    Public ReadOnly Property RegistrationNumber As String
        Get
            Return licence_plate_number
        End Get
    End Property
End Class

当有一个参数化的公共构造函数时,Json.NET 将调用它,使用反射按名称将构造函数参数与 JSON 属性匹配,并使用缺失属性的默认值。按名称匹配不区分大小写,除非有多个仅大小写不同的匹配项,在这种情况下,匹配项区分大小写。

演示fiddle

如果您的类有多个公共构造函数,请将要使用的一个标记为&lt;JsonConstructor&gt;

【讨论】:

  • 太好了,这看起来像这个 jsonproperty 说明符正是我所追求的。我明天要试试看,当使用 Friend 修饰符时,Json.net 会填充车辆类。至于在 new() 上填充属性,我不能使用此方法,因为稍后可能需要更改另一个类的值。知道第二种方法也很方便,我相信它会很好用,我现在一直在使用 json net 并享受它。
  • 这很好用。 API (dcVehicles) 正在填充 Vehicle 的 Friend 属性,应用程序可以使用 Public ReadOnly 属性来完成它需要的操作。总而言之,要使用 Json 网络库 json 网络填充 Friend 或 Private 属性,需要使用额外的属性 进行标记。然而,如果属性或变量是 Public,这似乎是没有必要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多