2016-05-23 85 views
1

我有一個JSON字符串,如下所示。我想以編程方式從它中刪除空的數組對象,以便我可以將它轉換爲DataTable從JSON字符串中刪除空陣列成員

這裏是我的JSON的例子:

{ 
    "result":[ 
    { 
     "id":"1", 
     "name": "Temp", 
     "property":[] 
    }, 
    { 
     "id":"2", 
     "name": "Temp2", 
     "property":[] 
    } 
    ] 
} 

你可以看到property成員在每個結果是一個空數組。有關我如何刪除它的任何建議?

目前我做了以下的JSON轉換爲DataTable

DataTable dt = JsonConvert.DeserializeObject<DataTable>(data["result"].ToString()); 

當我手動刪除數組屬性,轉換完美的作品。

+2

不要直行到一個數據表,反序列化到一個自定義類,然後將其轉換爲數據表(如果需要的話)。 – Crowcoder

+0

[刪除空數組元素]可能的重複(http://stackoverflow.com/questions/3654295/remove-empty-array-elements) – Pehlaj

回答

0

這是如何從JSON刪除「財產」陣列和剩餘的數據分析到數據表:

foreach (var item in data["result"]) 
{ 
     JObject obj = (JObject)item; 
     obj.Property("property").Remove(); 
} 

DataTable dt = JsonConvert.DeserializeObject<DataTable>(data["result"].ToString()); 
+0

是否有一個選項可以刪除空的數組成員而不需要創建類?我試圖創建一個動態函數,可以刪除任何空的數組成員,JSON字符串有時可能會有所不同。 –

+0

好的。我正根據您的需要編輯源代碼。 你想從json中刪除數組'屬性'。 – Saadi

1

你可以使用正則表達式來從JSON字符串本身空數組刪除屬性。這裏有一個使用兩個正則表達式,一個用空數組來殺死屬性,另一個用來殺掉剩下的錯誤逗號。

var json = "{\"prop\": [], \"prop2\": \"test\", \"propqw\": []}"; 
var removeEmpty = new Regex("\\s*\"[^\"]+\":\\s*\\[\\]\\,?"); 
var removeComma = new Regex(",(?=\\s*})"); 
var result = removeEmpty.Replace(json, ""); 
result = removeComma.Replace(result, ""); 

可能有比這更簡潔的方式,但我無法快速找到一個正則表達式的方式來刪除屬性和清除潛在的非法逗號。

+1

我不會推薦使用Regex來解析/操作JSON。這太容易出錯。改用JObjects。 –

+0

贊同Brian Rogers,Regex更有可能導致未來的問題,並且有更好的方法來處理這個問題。 –

0

您可以使用Json.Net的LINQ-to-JSON API刪除空數組屬性(無論它們的名稱),然後將結果轉換爲一個DataTable:

JObject data = JObject.Parse(json); 

var emptyArrayProperties = data["result"] 
    .Children<JObject>() 
    .SelectMany(jo => jo.Properties()) 
    .Where(jp => jp.Value.Type == JTokenType.Array && !jp.Value.HasValues) 
    .ToList(); 

foreach (JProperty prop in emptyArrayProperties) 
{ 
    prop.Remove(); 
} 

DataTable table = obj["result"].ToObject<DataTable>(); 

小提琴:https://dotnetfiddle.net/rVIijq