#json #vb.net #json.net
#json #vb.net #json.net
Вопрос:
В настоящее время у меня есть следующее:
Dim persons_dr = dt_driverdetails.Select("[B@] = '2' and [PolRef@] = 'YOLX14PC01'")
Dim rss As JObject = New JObject(New JProperty("people"))
For Each row As DataRow In persons_dr
Dim person As person = New person With {
.person_id = row("person_id").ToString,
.email = row("email").ToString,
.mobile = row("mobile").ToString,
.forename = row("forename").ToString,
.surname = row("surname").ToString
}
Dim o As JObject = CType(JToken.FromObject(person), JObject)
rss.Add(New JProperty(o, New JObject()))
Next
В массиве может быть описано несколько person
объектов people
.
For Each
Цикл генерирует новый объект задания для каждого person
. Я хочу добавить их все в объект rss
задания, чтобы мой объект задания получился таким, как показано в примере ниже:
{
"people": [{
"person_id": "71DLUOBNERUA1002",
"email": "test1@gmail.com",
"mobile": " 4412345678",
"forename": "John",
"surname": "Hopkins"
},
{
"person_id": "71DLUOBNERUA1002",
"email": "test1@gmail.com",
"mobile": " 4412345678",
"forename": "John",
"surname": "Hopkins"
}]
}
Однако я получаю сообщение об ошибке: объект не может быть преобразован в строку.
Я предполагаю, что это потому, что я использовал JProperty.
Любой совет был бы замечательным — в идеале, кто-нибудь скажет мне, где я ошибся, а не просто исправит мой код — стремлюсь учиться 🙂
Обновить
Public Class person
Public Property person_id As String
Public Property email As String
Public Property mobile As String
Public Property forename As String
Public Property surname As String
End Class
Public Class people
Public Property persons As List(Of person)
End Class
Private Sub create_person_json()
Dim persons_dr = dt_driverdetails.Select("[B@] = '2' and [PolRef@] = 'YOLX14PC01'")
Dim people As New people
'Dim rss As JObject = New JObject(New JProperty("people"))
For Each row As DataRow In persons_dr
Dim person As person = New person With {
.person_id = row("person_id").ToString,
.email = row("email").ToString,
.mobile = row("mobile").ToString,
.forename = row("forename").ToString,
.surname = row("surname").ToString
}
people.persons.Add(person)
'Dim o As JObject = CType(JToken.FromObject(person), JObject)
Next
End Sub
ОБНОВЛЕНИЕ 2
Если бы я хотел вставить другой набор JSON в список, как показано ниже:
"people": [{
"person_id": "71DLUOBNERUA1002",
"email": "test1@gmail.com",
"mobile": " 4412345678",
"forename": "John",
"surname": "Hopkins"
"address": {
"line_1": "76 This Place",
"postal_code": "BB11 8DL",
"country": "GB"
},
}]
Могу ли я выполнить следующие мои классы:
Public Class person
Public Property person_id As String
Public Property email As String
Public Property mobile As String
Public Property forename As String
Public Property surname As String
Public Property address As New address()
Public Property dob As String
'Public Property driverdetails As New driver_details()
End Class
Public Class address
Public Property line_1 As String
Public Property town_city As String
Public Property postal_code As String
Public Property country As String
End Class
Тогда как я могу включить это в свой существующий код, поскольку я не могу добавить его в объект «person», потому что сначала мне нужно инициализировать класс?
Ответ №1:
Использование a .Модель сетевого класса, описывающая JSON, упрощает обработку значений свойств и создание объектов: это намного проще, чем работать с JTokens и производными объектами.
<JsonProperty()>
Атрибут позволяет использовать имена свойств в модели класса, которые отличаются от JSON. Это часто используется, когда свойства JSON используют имена, которые являются зарезервированными словами на языке или когда это считается необходимым / предпочтительным.
Сериализатор (или десериализатор) Json сопоставит имена свойств модели класса с указанными атрибутами.
Смотрите также:
Структура JSON, показанная в вопросе, может быть воспроизведена с использованием следующей модели:
Примечание: имена здесь изменены, чтобы показать использование <JsonProperty()>
атрибута.
Public Class PeopleRoot
<JsonProperty("people")>
Public Property People As List(Of Person) = New List(Of Person)
End Class
Public Class Person
<JsonProperty("person_id")>
Public Property PersonId As String
<JsonProperty("email")>
Public Property Email As String
<JsonProperty("mobile")>
Public Property Mobile As String
<JsonProperty("forename")>
Public Property FirstName As String
<JsonProperty("surname")>
Public Property Surname As String
<JsonProperty("address")>
Public Property Address As PersonAddress
End Class
Public Class PersonAddress
Public Property line_1 As String
Public Property town_city As String
Public Property postal_code As String
Public Property country As String
End Class
Чтобы инициализировать PeopleRoot.People
свойство как a List(Of Person)
, просто объявите новый PeopleRoot
объект:
Dim root As New PeopleRoot()
' Add new Person objects:
root.People.AddRange({
New Person With {
.PersonId = "ID1",
.Email = "email1@service1.com",
.Mobile = "12345678",
.FirstName = "Person1",
.Surname = "Surname1",
.Address = New PersonAddress() With {
.line_1 = "Line1", .town_city = "Town1", .postal_code = "12345", .country = "Country1"
}
},
New Person With {
.PersonId = "ID2",
.Email = "email2@service2.com",
.Mobile = "34567890",
.FirstName = "Person2",
.Surname = "Surname2",
.Address = New PersonAddress() With {
.line_1 = "Line2", .town_city = "Town2", .postal_code = "34567", .country = "Country2"
}
}
})
' Serialize the new values
Dim json = JsonConvert.SerializeObject(root)
Эта структура сериализуется как исходный JSON:
{
"people":[
{
"person_id":"ID1",
"email":"email1@service1.com",
"mobile":"12345678",
"forename":"Person1",
"surname":"Surname1",
"address":{
"line_1":"Line1",
"town_city":"Town1",
"postal_code":"12345",
"country":"Country1"
}
},
{
"person_id":"ID2",
"email":"email2@service2.com",
"mobile":"34567890",
"forename":"Person2",
"surname":"Surname2",
"address":{
"line_1":"Line2",
"town_city":"Town2",
"postal_code":"34567",
"country":"Country2"
}
}
]
}
который, конечно, может быть десериализован как:
Dim obJPeople = JsonConvert.DeserializeObject(Of PeopleRoot)(jsonString)
Комментарии:
1. Используя ваш метод выше, если значение не существует, и я извлекаю информацию из DataRow из DataTable — как я могу установить для него значение «Ничего», чтобы, если данные не существуют, они не создавали элемент. У меня есть обработка NullValueHandling. Игнорировать set в настройках SerializeObject, как мне установить значение по умолчанию для всех моих записей равным «Ничего», чтобы они не появлялись после сериализации.
2. Вам нужно опубликовать еще один вопрос, добавив детали ваших операций. Не совсем понятно, о чем вы здесь спрашиваете.