【问题标题】:Convert Int to String while serialize object using JSON.NET使用 JSON.NET 序列化对象时将 Int 转换为 String
【发布时间】:2016-09-25 08:26:33
【问题描述】:

我尝试使用 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","Name":"Role1"},{"ID":"2","Name":"Role2"}]

请给我解决方案。谢谢

【问题讨论】:

    标签: json c#-4.0 json.net


    【解决方案1】:

    为什么不能把 ID 列保存为字符串,像这样:

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

    或者简单地说:

    tab.Columns.Add("ID");
    

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

    【讨论】:

    • 我只是将其作为示例展示。实际上,我将使用 ado.net 从数据库中获取数据表,它可能有多个数据类型列。我只要求这种情况。
    • 我明白了,将整个DataTable转换为字符串,然后再转换为JSON,对你有帮助吗?如果您需要样品,请告诉我。
    【解决方案2】:

    您可以使用第三方.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();
    

    【讨论】:

    • 我只使用 newtonsoft。我猜你误解了我的问题。我现在编辑了我的问题。请检查
    【解决方案3】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多