2016-10-20 7 views
3

В настоящее время я пишу API, который принимает объекты из веб-службы, обрабатывающей его в VB.net, используя библиотеку Newsoft JSON .NET.Newsoft JSON .NET Deserializing для объекта с частными свойствами в VB.net

Я десериализую массив JSON, названный Транспортными средствами, в список транспортных средств.

Вот важные фрагменты кода:

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 с модификатором уровня Friend/private access, но 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

Что вы хотите увидеть в JSON для 'Vehicle'? 'RegistrationNumber' или' licence_plate_number'? – dbc

ответ

1

Если вы просто хотите сериализовать Private или Friend свойство с Json.NET, отметьте его <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 - это именно то, что мне нужно. Я собираюсь попробовать это завтра, чтобы увидеть, что Json.net затем заполняет класс транспортных средств при использовании модификатора Friend. Что касается заполнения свойства new(), я не могу использовать этот метод, потому что другому классу может понадобиться изменить значение позже. Это также полезно знать второй метод, и я уверен, что это пригодится, я всегда работаю с json net и наслаждаюсь этим. – Pure

+0

Отлично работает. API (dcVehicles) заполняет свойства «Друг» для транспортного средства, и приложение может использовать свойство Public ReadOnly для выполнения именно того, что ему нужно. В заключение, чтобы заполнить свойства Friend или Private с помощью библиотеки Json net, json net необходимо пометить дополнительным атрибутом . Принимая во внимание, что если свойство или переменная Public, это необязательно. Благодарю. – Pure

 Смежные вопросы

  • Нет связанных вопросов^_^