2017-12-27 1134 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