首页 > 解决方案 > 如何在不使用属性名称的情况下获取每个 JSON 对象的第二项?

问题描述

在下面的部分中,我想records在这个 JSON 文件中获取第二个属性。如果我将[1]in 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]有没有办法通过使用索引来获取每个对象中的所有第二个条目来做我想做的事情?

更新#1

为了澄清,我想在对象中的数组之后获取每个属性值。因此,如果我查询,那么我想要所有这些属性值,而不是属性数组值。这是我正在尝试/想要做的一个示例,尽管这不起作用并且在属性数组上崩溃:attributesrecordsName, 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

本质上,我想跳过属性数组,然后获取它之后的每个值。

标签: jsonvb.netjson.netsalesforcesoql

解决方案


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


推荐阅读