Как получить второй элемент для каждого объекта JSON без использования имени свойства? - PullRequest
1 голос
/ 13 марта 2019

В следующем сегменте я хочу получить второе свойство в пределах всех records в этом файле JSON.Если я заменю [1] в jObjects.SelectTokens("records[*].[1]") на .Name, я получу правильный вывод, но он ограничивается только именем.

If response.IsSuccessStatusCode Then
    Try
        Dim jObjects As JObject = JObject.Parse(jsonString)
        For Each tk As JToken In jObjects.SelectTokens("records[*].[1]")
            jsonList.Add(tk)
        Next
        For Each strng As String In jsonList
            txtQueryOutput.AppendText(strng + vbCrLf)
        Next
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End If

Приложение принимает запросы в форме SOQL, а затем я беру ответ и анализирую его.Поэтому, если я запрашиваю SELECT name FROM contact, я получаю следующее:

"totalSize" : 21,
"done" : true,
"records" : [ {
    "attributes" : {
      "type" : "Contact",
      "url" : "/services/data/v36.0/sobjects/Contact/0031U00000GtLxDQAV"
    },
    "Name" : "Jack Rogers"
  }, {
    "attributes" : {
      "type" : "Contact",
      "url" : "/services/data/v36.0/sobjects/Contact/0031U00000GlhHTQAZ"
    },
    "Name" : "Rose Gonzalez"
  },

Затем я могу запросить SELECT phone FROM contact и получить то же самое, за исключением Name, в ответе JSON будет Phone.Есть ли способ сделать то, что я пытаюсь сделать, используя индекс [1], чтобы получить все вторые записи в каждом объекте?

UPDATE # 1

Чтобы уточнить, я хочу получить каждое значение свойства после массива attributes в объекте records.Поэтому, если я запрашиваю Name, Phone, Email, то мне нужны все эти значения свойств, но не значения массива атрибутов.Вот пример того, что я пытаюсь / хочу сделать, хотя это не работает и вылетает в массиве атрибутов:

Dim data As List(Of JToken) = jObjects.Children().ToList

For Each item As JProperty In data
    item.CreateReader()
    Select Case item.Name
        Case "records"
            For Each subItem As JProperty In item
                Select Case subItem.Name
                    Case "attributes"
                        'skip
                    Case Else
                        txtQueryOutput.AppendText(subItem.Value)
                End Select
            Next
    End Select
Next

По сути, я хочу пропустить массив атрибутов и просто получитькаждое значение после него.

1 Ответ

0 голосов
/ 05 мая 2019

Вы можете получить все значения свойств от объектов в массиве records, исключая attributes, используя запрос LINQ, подобный следующему:

Dim jObjects As JObject = JObject.Parse(jsonString)

Dim values As List(Of String) = jObjects("records") _
    .Children(Of JObject) _
    .SelectMany(Function(jo) jo.Properties()) _
    .Where(Function(jp) jp.Name <> "attributes") _
    .Select(Function(jp) CStr(jp.Value)) _
    .ToList()

txtQueryOutput.AppendText(String.Join(vbCrLf, values))

Рабочая демонстрация здесь: https://dotnetfiddle.net/ubqVnJ

...