【问题标题】:How to make JSON from a DataTable with variables as Key如何从以变量为键的 DataTable 生成 JSON
【发布时间】:2019-04-28 22:00:26
【问题描述】:

我有一个来自数据库的查询,其中许多行存储在 DataTable 中。

我有 40 个 ID,但每个 ID 有 300 行。 数据如下所示:

我想以 IDF_SD 作为键将 DataTable 中的这个序列化为 JSON。

序列化 DataTable 后,我得到的 JSON 如下所示:

谁能帮我解决这个问题? 我将在前端将此数据用于 js 图。 我想要类似的东西:

{
    "ID": {
        "f_sd1": {
            "value": 1.555
        }
        "f_sd2": {
            "value": xxxx
        }
    }
    "nextID": {
        "f_sd1": {
            "value": 1.555
        }
        "f_sd2": {
            "value": xxxx
        }
    }
}

我现在是这样序列化的:

using (con = new OracleConnection(constr))
{
    using (cmd = new OracleCommand(query, con))
    {
        con.Open();

        OracleDataAdapter sda = new OracleDataAdapter(cmd);
        sda.Fill(dt1);                    
        var list = JsonConvert.SerializeObject(dt1, Formatting.None, new JsonSerializerSettings() {
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        });

        return Content(list, "application/json");                    
    }
}

【问题讨论】:

标签: c# json asp.net-mvc serialization json.net


【解决方案1】:

1- 从您的数据表中创建一个字典对象。 2-通过'Install-Package Newtonsoft.Json'添加带有nuget的newtonsoft包 3- 然后像这样使用 JsonConvert.SerializeObject 方法:

JsonConvert.SerializeObject(dictionaryObject);

【讨论】:

  • 我尝试了字典,但仍然出现错误:“已添加具有相同键的项目。”我认为这是因为相同的 ID 在很多行上。
【解决方案2】:

你在考虑清单吗?如果是这样创建您的 DataModel

 public class DataModel
        {
            public string ID { get; set; }
            public List<string> fid{ get; set; }
            public string Value { get; set; }      
        }

然后使用 NewtonSoft Json 序列化您的对象

Newtonsoft.Json.JsonConvert.SerializeObject(DataMOdel))

【讨论】:

    【解决方案3】:

    试试:

    using Newtonsoft.Json.JsonWriter

     using (JsonWriter writer = new JsonTextWriter(sw))
     {
         for(int i = 0; i < table.Rows.Count; )
         {
            writer.WritePropertyName(table.Rows[i]["ID"]);
            writer.WriteStartObject();
            DataRow[] idsMatch = table.Select("ID = "+table.Rows[i]["ID"])+"");]
    
            foreach(DataRow row in idsMatch)
            {
              writer.WritePropertyName("f_sd"+row["F_SD"]);
              writer.WriteStartObject();
              writer.WritePropertyName("value");
              writer.WriteValue(row["VAL"]);
              writer.WriteEndObject();
              i++;
            }
    
            writer.WriteEndObject();
         }
       }
    

    【讨论】:

    • 谢谢。它在调试中看起来不错。但是怎么退货呢?当我返回时,它显示“在序列化 'System.Globalization.CultureInfo' 类型的对象时检测到循环引用”。有什么想法可以解决吗?
    • writer.ToString() 应该可以完成这项工作,您可能需要分别在开头和结尾添加 writer.WriteStartObject() 和 writer.WriteEndObject() 以将其全部包装起来JSON 对象。
    • writer.ToString() 不工作。它仅显示 writer 的某些属性,而不显示结果数据。如果我返回 StringBuilder 它会显示数据但不像 json 并且带有许多双引号和反斜杠。
    【解决方案4】:

    您可以使用 Linq 方法将 DataTable 的行分组到一个匿名对象结构中,然后对其进行序列化:

        var obj = dt1.Rows
            .Cast<DataRow>()
            .GroupBy(row => (int)row["ID"])
            .ToDictionary(g => g.Key,
                          g => g.ToDictionary(row => (int)row["F_SD"],
                                              row => new { value = (decimal)row["VAL"] }));
    
        string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
    
        return Content(json, "application/json");
    

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

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多