使用具有值

时间:2017-06-23 05:45:58

标签: c# sql sql-server json json.net

我有一个像这样的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行以上,稍后可能会添加更多行。所以我想避免在特定列上使用自定义逻辑。

3 个答案:

答案 0 :(得分:0)

您可以使用字符串数组而不是字符串创建动态类型:

j

答案 1 :(得分:0)

您可以使用自定义JsonConverterDataTable序列化为所需格式。这样的事情应该有效:

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数据