我有一个像这样的DataTable:Sample DataTable
我要求输出的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)
您可以使用字符串数组而不是字符串创建动态类型:
j
答案 1 :(得分: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
答案 2 :(得分:-2)
这样做
var jsonString = JsonConvert.SerializeObject(someObjet);
var myObject = JsonConvert.DeserializeObject<MyType>(jsonString);
将srting转换为json并使用myObject数据