NewtonSoft JSON Добавить объект задания в объект задания

#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. Вам нужно опубликовать еще один вопрос, добавив детали ваших операций. Не совсем понятно, о чем вы здесь спрашиваете.