c# - JSON.NET:如何在不在数组中的情况下仅序列化 DataTable 对象中的一行?

标签 c# json json.net

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

问题是这样的:如果我只是将 DataTable 传递给 JsonConvert.SerializeObject 方法,例如JsonConvert.SerializeObject(dt),我得到一个 JSON 字符串,但它是一个包含一个对象的数组。例如:

[ {"id":"1","value":"hi"} ]

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

{"id":"1","value":"hi"}

我现在使用的天真的方法是只返回 result.Substring(1,result.Length - 2) 给调用者。假设 JSON 对象存在于只有一个对象的单个数组中,这具有从返回文本中剥离 [] 的效果。但似乎应该有一种“适当”的方式来实现这一目标。

最明显的事情似乎是使用 DataTable 的 Rows 属性。但是,如果我尝试执行 JsonConvert.SerializeObject(dt.Rows[0]),我得到的不仅仅是行,我还得到了关于行状态的整个数据集合,其中一个项目是 Table 但它只是引用整个表,所以如果出现不止一行,我会得到所有的行,而不仅仅是我想要的那一行。

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

这是尝试序列化 Row 对象给我的结果:

{
    "RowError":"",
    "RowState":2,
    "Table":[
        {
            "id":"1",
            "value":"hello"
        }
    ],
    "ItemArray":[
        "1","hello"
    ],
    "HasErrors":false
}

我能否以“正确”的方式做到这一点,而不仅仅是从字符串中剥离 []?换句话说,我是否可以从 DataTable 的一行中获取数据作为单个 JSON 对象,而不是在数组中,而不通过 JSON 来回返回只是为了从单项数组中取出它?

最佳答案

您可以使用 LINQ-to-JSON APIDataRow 构建一个 JObject。例如:

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);

输出:

{"id":"1","value":"hi"}

fiddle :https://dotnetfiddle.net/ndL1xu

关于c# - JSON.NET:如何在不在数组中的情况下仅序列化 DataTable 对象中的一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43315700/

相关文章:

c# - 我如何确保在 .NET 中正确处理对象?

c# - 从两个数据表中选择 Linq to SQL 中的不同和日期差异

java spring MappingJacksonJsonView 没有在 mongodb ObjectId 上执行 toString

c# - json.net 可枚举

c# - DeserializeObject<T> 返回具有空/默认值的对象

c# - 如何将对象从 form1 传递到 form2 再返回到 form1?

c# - SelectedIndexChanges 在 TextChanged 事件之前触发

php - 查询通过 phpMyAdmin 工作,但不能通过从 viewController 调用的 php 脚本工作

java - Jersey 客户端解码 JSON 包含根元素错误

c# - 反序列化 JSON 字符串列表以找到正确的模型