将数据行转换为JSON对象

时间:2015-10-28 19:19:20

标签: c# .net json datatable

我有一个数据表whis只有一行,看起来像

   America              |  Africa               |     Japan     |   
   -------------------------------------------------------------
  {"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}} 

datatble列是美国,非洲,日本

现在我想将数据表转换为JSon,使json看起来像

{
"America": {
    "Id": 1,
    "Title": "Ka"
},
"Africa": {
    "Id": 2,
    "Title": "Sf"
},
"Japan": {
    "Id": 3,
    "Title": "Ja",
    "Values": {
        "ValID": 4,
        "Type": "Okinawa"
    }
   }
  }  

我的尝试是,

    string js = JSonConvverter.Serializeobject(datatable);
    var objType =  JObject.Parse(js);

但它没有用。

任何帮助都将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:12)

Json.NET有一个特殊的内置转换器DataTableConverter,它以缩略格式输出数据表。虽然它也有one for DataSet,但它没有针对DataRow的特定内置转换器。因此,在序列化DataRow时,它将序列化DataRow的所有字段和属性,从而产生更详细的输出。

如果要在DataRow使用的更紧凑的表单中序列化DataTable,最简单的方法是使用{{3将整个表序列化为JArray然后选择第一个元素,如下所示:

        var datatable = MakeTable();

        var objType = JArray.FromObject(datatable, JsonSerializer.CreateDefault(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).FirstOrDefault(); // Get the first row            
        var js = objType.ToString(); 

        Debug.WriteLine(js); // Outputs abbreviated JSON as desired.

哪个输出:

{
  "America": {
    "Id": 1,
    "Title": "Ka"
  },
  "Africa": {
    "Id": 2,
    "Title": "Sf"
  },
  "Japan": {
    "Id": 3,
    "Title": "Ja",
    "Values": {
      "ValID": 4,
      "Type": "Okinawa"
    }
  }

完整示例:

public class Values
{
    public int ValID { get; set; }
    public string Type { get; set; }
}

public class Place
{
    public int Id { get; set; }
    public string Title { get; set; }
    public Values Values { get; set; }
}

public class TestClass
{
    static DataTable MakeTable()
    {
        var table = new DataTable();

        table.Columns.Add("America", typeof(Place));
        table.Columns.Add("Africa", typeof(Place));
        table.Columns.Add("Japan", typeof(Place));

        DataRow row = table.NewRow();

        row["America"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":1,""Title"":""Ka""}");
        row["Africa"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":2,""Title"":""Sf""}");
        row["Japan"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":3,""Title"":""Ja"",""Values"":{""ValID"":4,""Type"":""Okinawa""}}");
        table.Rows.Add(row);    
        return table;

    }

    public static void Test()
    {
        var datatable = MakeTable();

        var objType = JArray.FromObject(datatable, JsonSerializer.CreateDefault(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).FirstOrDefault(); // Get the first row            
        var js = objType.ToString(); 

        Debug.WriteLine(js); // Outputs abbreviated JSON as desired.
    }
}

答案 1 :(得分:2)

拼写?你不应该调用“SerializeObject”方法:

string js = JsonConvert.SerializeObject(datatable);

另请参阅有关转换datatable to JSON string的类似问题。

答案 2 :(得分:2)

像Gazzi一样,你应该包含它包含在Visual Studio中的NewtonSoft.Json库。

要获得与您所描述的类似的对象,您应该创建一个像Country.cs这样的数据模型。

[Serializable]
public class CountryModel {
   public int ID { get; set; }
   public string Title { get; set; }
   public List<ValueModel> Values { get; set; }
}

[Serializable]
public class ValueModel {
   public int ValueID { get; set; }
   public string Type { get; set; }
}

创建一个帮助函数,将表数据转换为这些模型。然后,您可以根据需要使用Newtonsoft库序列化/反序列化数据。

答案 3 :(得分:1)

作为找到答案here的替代方法,您可以使用ExpandoObject快速,轻松地将单行呈现为JSON,例如:

var expando = new System.Dynamic.ExpandoObject() as IDictionary<string, object>;
foreach (DataColumn col in myRow.Table.Columns)
{
    eo[col.ColumnName] = myRow[col];
}
var json = JsonConvert.SerializeObject(expando);