2017-12-27 405 views
1

我已经在JSON串以下列组织数据(举个例子,我已经格式化的一行)提取数据

[ 
    { 
    "id": 60237, 
    "categories": [ 
     { "name": "name1" }, 
     { "name": "name2" }] 
    } 
] 

我使用以下类:

Public Class Entry 
    Public Property Id As Integer 
    Public Property Categories As Category() 
End Class 

Public Class Category 
    Public Property Name As String 
End Class 

我一直在使用JSON.NET

Dim entries() As Entry = JsonConvert.DeserializeObject(Of Entry())(JSONSTRING) 

想从JSON字符串中提取,具有LIN deserialised Q请求,来自“类别”字段的数据与已定义类别名称的列表。 例如,我想提取每个类别名称为“name1”和“name2”的数据“行”。该列表可以采用以下形式:dim desiredcategories = {“name1”,“Name2”}

注意:类别名称未由我定义,可以更改。但是,即使其他类别更改或添加或删除,Name1和Name2也保持不变。

你能帮我在VB .NET中写入“where”行吗?

Dim requestanswer = From entry In entries 
        Where ??? 

注意:为简化后,我还没有把“其中”线被制作成相同的请求,其他元件,其JSON字符串和其他类等内。

+2

“提取”从JSON数据通常做通过反序列化它。使用JSON.NET而不是Linq。它也可以通过解析完成,但你已经有了类。阅读[问]并参加[旅游] – Plutonix

+0

_I想要从“类别”字段中提取数据,并带有已定义类别的列表_ - 如果您希望所有已定义的类别 - 您根本不需要“Where”。 'allCategories = entries.SelectMany(e => e.Categories).Select(c => c.Name);' – Fabio

+0

您的'Category'类只有名称,没有值?你期望得到什么回报? – NetMage

回答

1

让您所需的类别名称的列表:

Dim list As New List(Of String) 
list.Add("name1") 
list.Add("name2") 

然后你可以用下面的代码做滤波基于所需的类别:

Dim entries as new List(of Entry) 

Dim entry1 as new Entry() 
entry1.Id = 60237 

Dim category1 as new Category() 
category1.Name = "name1" 
Dim category2 as new Category() 
category2.Name = "name2" 

Dim c as new List(of Category) 

c.Add(category1) 
c.Add(category2) 

entry1.Categories = c.ToArray() 

entries.Add(entry1) 

Dim list As New List(Of String) 
list.Add("name1") 
list.Add("name2") 

Dim requestanswer =(From entry In entries Where(From category In entry.Categories Where list.Contains(category.Name)).Count() > 0 select entry).ToList() 

for each ra as Entry in requestanswer 
    Console.WriteLine(ra.id) 
next