将数据行转换为JSON对象

Sci*_*y13 9 .net c# datatable json

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

   America              |  Africa               |     Japan     |   
   -------------------------------------------------------------
  {"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}} 
Run Code Online (Sandbox Code Playgroud)

数据列是美国,非洲,日本

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

{
"America": {
    "Id": 1,
    "Title": "Ka"
},
"Africa": {
    "Id": 2,
    "Title": "Sf"
},
"Japan": {
    "Id": 3,
    "Title": "Ja",
    "Values": {
        "ValID": 4,
        "Type": "Okinawa"
    }
  }
}  
Run Code Online (Sandbox Code Playgroud)

我的尝试是,

string js = JSonConvverter.Serializeobject(datatable);
var objType =  JObject.Parse(js);
Run Code Online (Sandbox Code Playgroud)

但它没有用.

任何帮助将不胜感激.谢谢!

dbc*_*dbc 14

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

如果你想用DataRow更紧凑的形式 序列化一个DataTable,最简单的方法是将整个表序列化为一个JArray使用JArray.FromObject(),然后选出第一个元素,如下所示:

var rowIndex = 0;

var jArray = JArray.FromObject(datatable, JsonSerializer.CreateDefault(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));

var rowJToken = jArray[rowIndex];
var rowJson = rowJToken.ToString(Formatting.Indented);  // Or Formatting.None if you prefer
Run Code Online (Sandbox Code Playgroud)

哪个输出:

public class DataRowConverter : JsonConverter<DataRow>
{
    public override DataRow ReadJson(JsonReader reader, Type objectType, DataRow existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException(string.Format("{0} is only implemented for writing.", this));
    }

    public override void WriteJson(JsonWriter writer, DataRow row, JsonSerializer serializer)
    {
        var table = row.Table;
        if (table == null)
            throw new JsonSerializationException("no table");
        var contractResolver = serializer.ContractResolver as DefaultContractResolver;

        writer.WriteStartObject();
        foreach (DataColumn col in row.Table.Columns)
        {
            var value = row[col];

            if (serializer.NullValueHandling == NullValueHandling.Ignore && (value == null || value == DBNull.Value))
                continue;

            writer.WritePropertyName(contractResolver != null ? contractResolver.GetResolvedPropertyName(col.ColumnName) : col.ColumnName);
            serializer.Serialize(writer, value);
        }
        writer.WriteEndObject();
    }
}
Run Code Online (Sandbox Code Playgroud)

完整示例:

var row = datatable.Rows[rowIndex];

var settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    Converters = { new DataRowConverter() },
};
var rowJson = JsonConvert.SerializeObject(row, Formatting.Indented, settings);
Run Code Online (Sandbox Code Playgroud)


Bjö*_*erg 6

作为此处找到的答案的替代方案,您可以使用ExpandoObject快速且轻松地将单行呈现为 JSON,如下所示:

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


小智 4

拼写?您对“SerializeObject”方法的调用不应该是:

string js = JsonConvert.SerializeObject(datatable);
Run Code Online (Sandbox Code Playgroud)

另请参阅有关将数据表转换为 JSON 字符串的类似问题。