【问题标题】:How to get JSON data directly from the database table?如何直接从数据库表中获取 JSON 数据?
【发布时间】:2022-01-14 02:28:58
【问题描述】:

我的数据库表上的一列包含以下 JSON 序列化字符串。

Table: school_details

school_id     class_json

25            {
              "class_id": "1377",
              "class_name": "XXX",
               "No.of students": "100"
              }

25                {
             "class_id": "1378",
             "class_name": "YYX",
             "No.of students": "80"
                }

现在我想读取这些数据并将其作为 JSON 数组发送,如下面的“预期输出”所示。但是当我像下面这样做时,我得到了不同的输出。我应该如何更改代码以获得所需的输出?像上面那样在数据库表中直接存储 JSON 是一个好习惯吗?还是需要先转换成字符串再存入数据库?

   string school_id="25";
   string status="success";
   sql = "SELECT class_json FROM school_details WHERE school_id @school_id";

            cmd = new SqlCommand(sql, con);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@school_id", school_id);
            dr = cmd.ExecuteReader();
            var dt = new DataTable();
            if (dr.HasRows)
            {
               dt.Load(dr);
                status = "success";
            }
           var getData = new { status, school_id,Class_Deatils=dt };
        return getData;

输出:

{
  "status": "success",
  "school_id": "25",
  "Class_Deatils": [
 {
  "class_json ": "{\n  \"class_id\": \"1377\",\n  \"class_name\": \"XXX\",\n  \"No.of students\": \"100\"\n  }"
        },
 {
  "class_json ": "{\n  \"class_id\": \"1378\",\n  \"class_name\": \"YYX\",\n  \"No.of students\": \"80\"\n  }"
        }
  ]
  }

预期输出:

{
  "status": "success",
  "school_id": "25",
  "Class_Deatils": [{
  "class_id": "1377",
  "class_name": "XXX",
  "No.of students": "100"
  },
  {
  "class_id": "1378",
  "class_name": "YYX",
  "No.of students": "80"
  }
  ]
  }

【问题讨论】:

  • 您需要将 JSON 反序列化为一个对象(可能是您制作的自定义类来表示数据)。
  • 你知道 \n 是换行符吗?它们在字符串中是否像那样可见?这看起来很像在调试器中为可视化而编码的字符串。你从哪里得到输出?请考虑不要使用数据表。
  • 您真的应该将该 JSON 规范化到另一个表中。顺便说一句,您的连接、命令和阅读器对象中缺少 using

标签: c# arrays json datatable


【解决方案1】:

我建议您使用序列化和反序列化来保存和检索数据库中的 JSON 数据,它可以帮助您预防问题,并且可以很好地控制您的 JSON 数据。您可以非常轻松地使用 Newtonsoft 库进行序列化和反序列化。

要查看示例,请访问https://www.newtonsoft.com/json

【讨论】:

    【解决方案2】:

    您在class_json 中得到的结果实际上是一个转义字符串,而不是纯 json。
    如果你想把它当作 json 使用,可以使用JObject.Parse() 方法。

    这是如何做到这一点的:

    using System;
    using Newtonsoft.Json.Linq;
                        
    public class Program
    {
        public static void Main()
        {
            string class_json_str = "{\n  \"class_id\": \"1377\",\n  \"class_name\": \"XXX\",\n  \"No.of students\": \"100\"\n  }";
            JObject o = JObject.Parse(class_json_str );
            
            // Now you have a JSON objects which contains the data.
            // You can access it's properties like this 
            var classId = o["class_id"];
            Console.WriteLine(classId);
    
            // In case you want to make a string again, use the following
            var jsonString = o.ToString();
            Console.WriteLine(jsonString);
        }
    }
    

    附:最好的做法是将它作为一个类正确反序列化,而不是把它当作一个 json 来玩。 然后在发送到前端时序列化回来。 欲了解更多信息,请参阅:
    https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2021-11-30
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多