vb.net - Newsoft JSON .NET 反序列化为 VB.net 中具有私有(private)属性的对象

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

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

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

以下是重要的代码片段:

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 正在创建一系列车辆。

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

问题是我尝试更改车辆类中的公共(public)属性以保持属性私有(private)并允许只读,如下所示:
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 网络仍然无法填充该对象。

唯一的方法是将其保持为公共(public)。

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

谢谢

最佳答案

如果你只想序列化一个 PrivateFriend Json.NET 的属性,用 <JsonProperty> 标记它并用 <JsonIgnore> 标记您不想序列化的公共(public)只读属性:

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

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

演示 fiddle .

如果您的类有多个公共(public)构造函数,请使用 <JsonConstructor> 标记要使用的构造函数。 .

关于vb.net - Newsoft JSON .NET 反序列化为 VB.net 中具有私有(private)属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40157503/

相关文章:

c# - Web Api 错误地反序列化枚举列表

c# - 展平 JToken

vb.net - OleDbCommandBuilder 生成的 INSERT INTO 语句中存在语法错误

java - 使用 serialVersionUID 还是禁止警告?

c# - .NET 构造函数和内存管理问题

c++ - boost::继承模板类的序列化

php - 反序列化有时会返回 false

c# - 如何让 WebAPI 使用 JsonProperty(Required = Required.Always) 验证我的 JSON?

vb.net - 通过 Visual Basic 应用程序在 Unix 服务器上执行命令

vb.net - Linq to Object 查询 vb.net 中的求和