Newsoft JSON .NET在VB.net中反序列化为具有私有属性的对象

我目前正在编写一个API,它使用Newsoft
JSON .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正在创建一系列车辆.

我试图用车辆类中的属性作为私有和只读来实现这一点,使用api的应用程序不应该能够设置这些.

问题是我已经尝试更改车辆类中的公共属性以保持属性私有并允许readonly如下:

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个类都在同一名称空间中.
所以我尝试使用licence_plate_number和Friend / private访问级别修饰符,但Json net仍然无法填充该对象.

唯一的方法是将其保持为公共.

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

谢谢

最佳答案 如果您只想使用Json.NET序列化Private或Friend属性,请使用
<JsonProperty>标记它,并使用
<JsonIgnore>标记您不想序列化的public readonly属性:

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.

如果您的类有多个公共构造函数,请标记要与<JsonConstructor>一起使用的构造函数.

点赞