在下段中,我想在此JSON文件中的所有records
中获取第二个属性。如果用.Name
中的jObjects.SelectTokens("records[*].[1]")
中的[1]
替换CC_2,我会得到正确的输出,但是它仅将其限制在名称中。
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
并获得相同的情况,除了JSON响应中的Name
将为Phone
。有什么方法可以通过使用索引[1]
来获取每个对象中的所有第二个条目来做我想做的事情?
更新#1
要澄清,我想在records
对象中的attributes
数组之后获取每个属性值。因此,如果我查询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
本质上,我想跳过属性数组,然后在其之后获取所有值。
您可以使用这样的linq查询从records
数组中的对象中获取所有属性值:
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