使用JSON.NET

时间:2016-05-27 06:08:39

标签: json c#-4.0 json.net

我尝试使用JObject(NewtonSoft.dll)将DataTable转换为JSON字符串。在我的情况下,表可能具有不同数据类型的值。我想在序列化对象时将这些值转换为字符串。

        DataTable tab = new DataTable();
        tab.Columns.Add("ID", typeof(int));
        tab.Columns.Add("Name");

        tab.Rows.Add(1, "Role1");
        tab.Rows.Add(2, "Role2");

        string strValues = JsonConvert.SerializeObject(tab);
        --output of strValues 
        -- [{"ID":1,"Name":"Role1"},{"ID":2,"Name":"Role2"}]

但它应该是这样的 -

  

[{" ID":" 1""名称":"基于role1"},{" ID&#34 ;:" 2""名称":"基于role2"}]

请给我解决方案。感谢

3 个答案:

答案 0 :(得分:3)

您可以使用第三方.dll,如Newtonsoft.Json

 DataTable tab = new DataTable();
 tab.Columns.Add("ID", typeof(int));
 tab.Columns.Add("Name");

 tab.Rows.Add(1, "Role1");
 tab.Rows.Add(2, "Role2");

 // Serialize to JSON string
 TextWriter output = new TextWriter();
 JsonTextWriter writer = new JsonTextWriter(output);
 writer.Formatting = JsonFormatting;
 JsonSerializer serializer = JsonSerializer.Create(JsonSerializerSettings);
 serializer.Serialize(writer, tab);
 writer.Flush();

答案 1 :(得分:0)

为什么不能将ID列保存为字符串,如下所示:

ON DUPLICATE KEY UPDATE pivot_data.goals = VALUES(goals)

或者简单地说:

tab.Columns.Add("ID", typeof(string));

我没有看到将其保存为Int的目的,然后尝试将其转换为String ...

答案 2 :(得分:0)

Json.Net随附的DataTableConverter无法自定义其写入值的方式。但是,如果要将整数(或任何其他值类型)呈现为字符串,则可以轻松地使自己的自定义DataTableConverter执行所需操作。以下是您需要的代码:

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)
            {
                object val = row[col];
                obj.Add(col.ColumnName, val != null ? val.ToString() : string.Empty);
            }
            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();
    }
}

像这样使用转换器:

string strValues = JsonConvert.SerializeObject(tab, new CustomDataTableConverter());

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