2016-10-20 1 views
3

현재 Newsoft JSON .NET 라이브러리를 사용하여 VB.net에서 처리하는 웹 서비스에서 개체를 가져 오는 API를 작성하고 있습니다.Newsoft JSON .NET VB.net에서 개인 속성을 사용하여 개체에 deserializing

차량 목록에 Vehicles라는 JSON 배열을 deserialize하고 있습니다.

여기서 중요한 코드 조각입니다 : 여기

Public Class VehicleList 
    Public Vehicles() As Vehicle 
End Class 

Public Class Vehicle 
    Public Property licence_plate_number As String 
End Class 

우리는 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 개의 클래스 모두가 동일한 네임 스페이스에 있습니다. 친구/개인 액세스 수준 수정 자와 함께 licence_plate_number를 시도했지만 여전히 Json net이 개체를 채울 수 없습니다.

유일한 방법은 공개로 유지하는 것입니다.

해결 방법에 대한 아이디어가 있습니까? 아니면 뭔가 간단한 것을 놓치고 있습니까?

감사

+0

json의 샘플을 제공 할 수 있습니까? – djv

+2

어쨌든 비공개 멤버를 직접 serialize 할 수는 없습니다. 그러나 해결책이 있습니다 (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

JSON에서 'Vehicle'에 대해 무엇을보고 싶습니까? '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 

매개 변수가 단일 public 생성자가있는 경우, Json.NET이에 대한 기본 값을 이름으로 JSON 속성에 생성자 인수를 일치 반사를 사용하여, 그것을 호출 누락 된 속성. 대/소문자 만 다른 대/소문자가 여러 개인 경우가 아니면 대/소문자를 구분하지 않습니다.

데모 fiddle.

클래스에 공용 생성자가 여러 개인 경우 <JsonConstructor>과 함께 사용하도록 표시하십시오.

+1

좋아,이 jsonproperty 지정자 정확히 내가 쫓아 버린 것 같습니다. 나는 내일 그것을보기 위해 시험 할 예정이다, 친구 수정자를 사용할 때, Json.net는 그 다음 차량 클래스를 채운다. new()에 속성을 채우는 것에 대해서는 나중에 다른 클래스에서 값을 변경해야 할 수 있으므로이 메서드를 사용할 수 없습니다. 두 번째 방법을 아는 것도 편리합니다. 잘 사용하게 될 것입니다. 저는 항상 json net을 사용하여 지금 즐기고 있습니다. – Pure

+0

위대한 작품입니다. API (dcVehicles)는 Vehicle의 Friend 속성을 채우고 있으며 응용 프로그램은 Public ReadOnly 속성을 사용하여 필요한 내용을 정확하게 수행 할 수 있습니다. 결론적으로 Friend 또는 Private 속성을 Json net 라이브러리로 채우려면 json net에 추가 속성 을 표시해야합니다. 속성이나 변수가 Public이라면 이것이 필요하지 않은 것처럼 보입니다. 감사. – Pure