2016-10-20 13 views
3

現在、私は、VB.netでNewsoft JSON .NETライブラリを使用してWebサービスからオブジェクトを取得しているAPIを作成しています。Newsoft JSON .NET VB.netのプライベートプロパティを持つオブジェクトへの逆シリアル化

私は車両のリストにVehiclesというJSON配列を逆シリアル化しています。

ここで重要なコードスニペットです:ここで

Public Class VehicleList 
    Public Vehicles() As Vehicle 
End Class 

Public Class Vehicle 
    Public Property licence_plate_number As String 
End Class 

我々はJSONをつかむWebクライアントを持っており、オブジェクトにそれを置きます。

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つのクラスはすべて同じ名前空間にあります。 フレンド/プライベートアクセスレベル修飾子でlicence_plate_numberを試しましたが、依然としてJson netがオブジェクトにデータを入力できません。

唯一の方法は、パブリックにすることです。

誰にも回避策がありますか?それとも、私は何か簡単なものを逃していますか

おかげ

+0

jsonのサンプルを提供できますか? – djv

+2

とにかく、プライベートメンバーを直接シリアル化することはできません。しかし、ソリューションがあります。(C#)http://stackoverflow.com/questions/10189471/json-net-serialize-private-members-and-not-readonly-properties、http://stackoverflow.com/questions/32008869/json-net-serialize-specific-private-field – djv

+0

「Vehicle」のJSONで何を見たいですか? 'RegistrationNumber'または' licence_plate_number'? – dbc

答えて

1

あなただけの、Json.NETとPrivateまたはFriendプロパティをシリアル化<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

クラスに複数のパブリックコンストラクタがある場合は、<JsonConstructor>で使用するマークを付けます。

+1

これはjsonproperty指定子がまさに私が何をしているかのようです。私は明日それを試してみるつもりですが、Friend修飾子を使用すると、Json.netは車両クラスに値を設定します。 new()にプロパティを設定する場合は、別のクラスで値を後で変更する必要があるため、このメソッドを使用することはできません。それは2番目の方法も知っていると便利です。私はそれがうまく利用できると確信しています、私はいつも今jsonネットで働いており、それを楽しんでいます。 – Pure

+0

これは素晴らしいです。 API(dcVehicles)はVehicleのFriendプロパティに値を設定しており、アプリケーションはPublic ReadOnlyプロパティを使用して必要なものを正確に実行できます。 結論として、フレンドまたはプライベートのプロパティにJsonネットライブラリを設定するには、json netに余分な属性を付ける必要があります。一方、プロパティまたは変数がPublicの場合、これは必要ではないようです。ありがとう。 – Pure

関連する問題