JSON.NET:如何在没有数组的情况下从DataTable对象中仅序列化一行?

fdm*_*ion 8 c# json json.net

我有一个数据库类,它调用数据库并检索数据.数据被加载到具有的DataTable对象中SqlDataAdapter.然后我想只获取第一行数据(实际上,数据库只会返回一行)并将其转换为JSON字符串.

问题是这样的:如果我简单地传递DataTableJsonConvert.SerializeObject方法,例如JsonConvert.SerializeObject(dt),我得到一个JSON字符串,但它是一个对象的数组.例如:

[ {"id":"1","value":"hi"} ]
Run Code Online (Sandbox Code Playgroud)

期望接收此JSON的另一端的代码不需要数组,它只需要一个对象.所以基本上我需要上面的,但没有方括号[].所以期望的输出是:

{"id":"1","value":"hi"}
Run Code Online (Sandbox Code Playgroud)

我现在使用的天真的方法是回到result.Substring(1,result.Length - 2)呼叫者.假设JSON对象存在于仅包含一个对象的单个数组中,这具有剥离[]关闭返回文本的效果.但似乎应该有一种"适当"的方式来实现这一目标.

最明显的事情似乎是使用RowsDataTable 的属性.但是,如果我尝试这样做JsonConvert.SerializeObject(dt.Rows[0]),我不会得到这一行,我得到一个关于行状态的整个数据集合,其中一个项目Table只是引用整个表格,所以如果超过发生了一行我会得到所有的行,而不仅仅是我想要的行.

我尝试过的另一种方法是从整个过程到JSON DataTable.我序列化DataTable,然后将结果解析成一个,JArray这样我就可以获得第一个值,然后再次重新序列化.但这似乎没必要.

以下是尝试序列化Row对象的原因:

{
    "RowError":"",
    "RowState":2,
    "Table":[
        {
            "id":"1",
            "value":"hello"
        }
    ],
    "ItemArray":[
        "1","hello"
    ],
    "HasErrors":false
}
Run Code Online (Sandbox Code Playgroud)

我能做到这一点的"正确"的方式,而不只是剥离[]落弦?换句话说,我是否可以将数据从一行DataTable作为单个JSON对象获取,而不是在数组中,而不是通过JSON往返,而只是从一项数组中取出它?

Bri*_*ers 10

你可以使用LINQ到JSON API建立一个JObjectDataRow.例如:

DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("value");
dt.Rows.Add("1", "hi");

string json = new JObject(
    dt.Columns.Cast<DataColumn>()
      .Select(c => new JProperty(c.ColumnName, JToken.FromObject(dt.Rows[0][c])))
).ToString(Formatting.None);

Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)

输出:

{"id":"1","value":"hi"}
Run Code Online (Sandbox Code Playgroud)

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