Newsoft JSON .NET 反序列化为 VB.net 中具有私有属性的对象
Newsoft JSON .NET Deserializing to an Object with Private Properties in VB.net
我目前正在编写一个 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 正在创建一系列车辆。
我正在尝试通过将车辆 class 中的属性设为私有和只读来实现此目的,使用 api 的应用程序应该无法设置这些属性。
问题是我已经尝试更改车辆 class 中的 public 属性 以保持 属性 私有并允许只读,如下所示:
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 classes 都在同一个命名空间中。
所以我尝试 licence_plate_number 使用 Friend/private 访问级别修饰符,但仍然 Json net 无法填充对象。
唯一的办法就是保持 Public。
有人有变通办法吗?还是我错过了一些简单的东西?
谢谢
如果你只想用Json.NET序列化Private
或Friend
属性,用<JsonProperty>
and mark the public readonly property you don't want to serialize with <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
当有一个参数化的 public 构造函数时,Json.NET 将调用它,使用反射按名称将构造函数参数与 JSON 属性匹配,并使用默认值缺少属性。按名称匹配不区分大小写,除非有多个匹配仅在大小写上有所不同,在这种情况下匹配将区分大小写。
演示fiddle。
如果您的 class 有多个 public 构造函数,请标记要与 <JsonConstructor>
一起使用的构造函数。
我目前正在编写一个 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 正在创建一系列车辆。
我正在尝试通过将车辆 class 中的属性设为私有和只读来实现此目的,使用 api 的应用程序应该无法设置这些属性。
问题是我已经尝试更改车辆 class 中的 public 属性 以保持 属性 私有并允许只读,如下所示:
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 classes 都在同一个命名空间中。 所以我尝试 licence_plate_number 使用 Friend/private 访问级别修饰符,但仍然 Json net 无法填充对象。
唯一的办法就是保持 Public。
有人有变通办法吗?还是我错过了一些简单的东西?
谢谢
如果你只想用Json.NET序列化Private
或Friend
属性,用<JsonProperty>
and mark the public readonly property you don't want to serialize with <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
当有一个参数化的 public 构造函数时,Json.NET 将调用它,使用反射按名称将构造函数参数与 JSON 属性匹配,并使用默认值缺少属性。按名称匹配不区分大小写,除非有多个匹配仅在大小写上有所不同,在这种情况下匹配将区分大小写。
演示fiddle。
如果您的 class 有多个 public 构造函数,请标记要与 <JsonConstructor>
一起使用的构造函数。