2017-06-23 50 views
0

我有這樣一個數據表中:Sample DataTable轉換一個數據表來JSON與具有值數組列

我需要作爲輸出的JSON是在下面的格式:

{ 
    "Column1": ["value1","value2"], 
    "Column2": ["value3"], 
    "Column3": ["value4","value5"] 
}, 
{ 
    "Column1": ["value1","value2"], 
    "Column2": ["value2","value3"], 
    "Column3": ["value4","value5"] 
} 

所以基本上我有一個每行中逗號分隔值列表。它也可以是單個值。如果有多個值,我希望JSON以指定的格式包含數組。

我完全控制格式化DataTable中的行。我試圖在SQL Server查詢本身中構建格式,但正如你所知,當執行JsonConvert.SerializeObject(Datatable)時,它會轉義不是我想要的雙引號。

請讓我知道如何才能做到這一點。 我在C#端使用SQL Server 2008和NewtonSoft Json。

編輯 -

DataTable中包含超過10行,可能會增加更多的後來。所以我想避免特定列上的自定義邏輯。

+0

你必須做代碼來轉換數組中的逗號分隔值。 –

+0

你的json在這些行''Column3「末尾用額外的逗號錯誤地形成:[」value4「,」value5「],' – Turophile

+0

你需要做的是重構你的數據庫。閱讀[在數據庫列中存儲分隔列表真的很糟糕嗎?](http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that -bad),在這裏你會看到很多原因,爲什麼這個問題的答案是**絕對是!**。 –

回答

0

您可以使用自定義JsonConverter,允許您將DataTable序列化爲您想要的格式。像這樣的東西應該工作:

class CustomDataTableConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DataTable); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     DataTable table = (DataTable)value; 
     JArray array = new JArray(); 
     foreach (DataRow row in table.Rows) 
     { 
      JObject obj = new JObject(); 
      foreach (DataColumn col in table.Columns) 
      { 
       if (col.ColumnName == "Id") continue; // skip Id column 

       if (row[col] != null && row[col] != DBNull.Value) 
       { 
        string[] values = row[col].ToString().Split(','); 
        obj.Add(col.ColumnName, JArray.FromObject(values)); 
       } 
       else 
       { 
        obj.Add(col.ColumnName, JValue.CreateNull()); 
       } 
      } 
      array.Add(obj); 
     } 
     array.WriteTo(writer); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

要使用轉換器,一個實例添加到Converters收集上JsonSerializerSettings並通過設置SerializeObject

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.Converters.Add(new CustomDataTableConverter()); 
settings.Formatting = Formatting.Indented; 

string json = JsonConvert.SerializeObject(table, settings); 

這裏是一個工作演示:https://dotnetfiddle.net/D0fw5w

+0

儘管需要一些定製,感謝小提琴,這解決了手頭的問題。 – Vishwas

1

您可以創建一個字符串,而不是字符串數組動態類型:

var json = table.AsEnumerable().Select(r => new 
{ 
    Column1 = r["Column1"].ToString().Split(','), 
    Column2 = r["Column2"].ToString().Split(','), 
    Column3 = r["Column3"].ToString().Split(','), 
}); 
+0

該問題詢問如何將錶轉換爲JSON。你在這裏創建一個匿名對象。您應該顯示最後一步將其序列化爲JSON。 –

-2

做這樣

var jsonString = JsonConvert.SerializeObject(someObjet); 

var myObject = JsonConvert.DeserializeObject<MyType>(jsonString); 

轉換srting成JSON和做用myObject的數據

+0

這是C#解決方案 –