C# 将 Json 对象转换为 DataTable以及[WebMethod]方法接收前端传入的JsonArray的方法、抛出 JsonSerializationException的原因

文章讲述了如何在.NET中使用Json.NET库将JSON数据转换为DataTable结构,包括使用JObject、Newtonsoft.Json库解析JSON数组,以及两种方法将JSON对象转换为DataTable并传递给数据库的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其他的一些转化可以参考我的另一篇文章https://blog.youkuaiyun.com/munangs/article/details/133950243

将Json 数据转换为 DataTable

未被JSON.stringify处理之前的数据张这样

[
         {
            "Id":"0",
            "Username":"Vreeswijk",
            "ProfilePicture":"media/user/0.png"
         },
         {
            "Id":"1",
            "Username":"Mony",
            "ProfilePicture":"media/user/12.png"
         }
      ]


在前台用js JSON.stringify处理过才传给后台,后台进行处理
//GET请求
public void test(string printList)

var dt = (DataTable)JsonConvert.DeserializeObject(printList,typeof(DataTable));

//传递给数据库
SqlParameter[] sql = new SqlParameter[1];
sql[0] = new SqlParameter('dt',dt);

//GET请求
public void test(string printList)

var dt = (DataTable)JsonConvert.DeserializeObject(printList,typeof(DataTable));

//传递给数据库
SqlParameter[] sql = new SqlParameter[1];
sql[0] = new SqlParameter('dt',dt);
----------------------------------------------------------------------------------
//如果是在JSON中获取
{
   "data": [
         {
            "Id":"0",
            "Username":"Vreeswijk",
            "ProfilePicture":"media/user/0.png"
         },
         {
            "Id":"1",
            "Username":"Mony",
            "ProfilePicture":"media/user/12.png"
         }
      ]
}

var jObject = JObject.Parse(json);
var printList= jObject["printList"] as string;

var dt = (DataTable)JsonConvert.DeserializeObject(printList,typeof(DataTable));

//传递给数据库
SqlParameter[] sql = new SqlParameter[1];
sql[0] = new SqlParameter('dt',dt);

其他将 Json 对象转换为 DataTable方法,其一

 string s = "{\n  \"Flag\": 1,\n  \"Data\": [\n    {\n      \"id\": 37,\n      \"pid\": \"105226\",\n      \"PName\": \"韩友庆\",\n      \"IName\": \"X线计算机体层(CT)平扫(1层-8层)\",\n      \"CName\": \"超声五室\",\n      \"Times\": \"10:00:00-14:00:00\",\n      \"checkdate\": \"2023-07-12T00:00:00\"\n    },\n    {\n      \"id\": 38,\n      \"pid\": \"105219\",\n      \"PName\": \"翟金花\",\n      \"IName\": \"X线计算机体层(CT)平扫(1层-8层)\",\n      \"CName\": \"超声五室\",\n      \"Times\": \"10:00:00-14:00:00\",\n      \"checkdate\": \"2023-07-12T00:00:00\"\n    }\n  ],\n  \"Msg\": \"\"\n}";
 JObject json = JObject.Parse(s);
JArray array = new JArray();
var d = json["Data"];
foreach(var a in d){
    array.Add(a);
}
           
dt = JsonConvert.DeserializeObject<DataTable>(array.ToString());

抛出 JsonSerializationException的原因
“容器”必须是 JArray。

错误的简单示例:

JObject query = new JObject();
JObject results = new JObject();
 
results.Add("Name", "Blue Umbrella");
results.Add("Price", 100);
 
query.Add("results", results);
 
DataTable dt = (DataTable)JsonConvert.DeserializeObject(query.ToString(), (typeof(DataTable)));

其二

1、使用Newtonsoft.Json库,将JSON数据转换为实体类,其中实体类的属性要和JSON数据的键值对应起来。

public class Student
{
	public string Name { get; set; }
	public string Age { get; set; }
	public string Sex { get; set; }
}

2、使用反射机制,将实体类的属性值转换为DataTable的列名,即DataTable的列名就是实体类的属性名。

// 定义DataTable
DataTable dt = new DataTable();
// 反射实体类属性
PropertyInfo[] propertyInfos = typeof(Student).GetProperties();
// 将实体类属性转换为DataTable的列名
foreach (PropertyInfo propertyInfo in propertyInfos)
{
     dt.Columns.Add(propertyInfo.Name);
}

3、将JSON数据转换为实体类的对象,将实体类对象的属性值转换为DataTable的行数据,完成JSON数据转换为DataTable的过程。

// 将JSON数据转换为实体类对象
Student student = JsonConvert.DeserializeObject<Student>(json);
// 将实体类对象的属性值转换为DataTable的行数据
DataRow dr = dt.NewRow();
foreach (PropertyInfo propertyInfo in propertyInfos)
{
    dr[propertyInfo.Name] = propertyInfo.GetValue(student);
}
dt.Rows.Add(dr);

[WebMethod]方法接收前端传入的JsonArray的方法

第一种方法:可以这样接收前端传入的jsonArray字符串到一个类的数组中,然后遍历该数组取值
这种方法需要创建PointConfig类

 class PointConfig
        {
            public string ptcrossing { get; set; }
            public string ptcrossingId { get; set; }
            public string camId { get; set; }
            public string pointid { get; set; }
            public string ptdirection { get; set; }
            public string ptGoSet { get; set; }
            public string ptGoEn { get; set; }
            public string ptLeftSet { get; set; }
            public string ptLeftEn { get; set; }
            public string ptRightSet { get; set; }
            public string ptRightEn { get; set; }
            public string ptname { get; set; }
            public string ptmainX { get; set; }
            public string ptmainY { get; set; }
            public string ptsubX { get; set; }
            public string ptsubY { get; set; }
            public string ptframediffX { get; set; }
            public string ptframediffY { get; set; }
            public string ptgreenlightX { get; set; }
            public string ptgreenlightY { get; set; }
            public string ptredlightX { get; set; }
            public string ptredlightY { get; set; }
            public string ptmainvalid { get; set; }
            public string ptsubvalid { get; set; }
            public string ptframediffvalid { get; set; }
            public string ptqueuelengthvalid { get; set; }
            public string ptcheckmethod { get; set; }
            public string ptchanneltypeA { get; set; }
            public string ptchanneltypeB { get; set; }
            public string cameraName { get; set; }
            public string xgr { get; set; }
        }

    [WebMethod]
    public static string checkPointConfigUpdateRecord(string pointObj)
    {
        PointConfig[] pointConfigs = JsonConvert.DeserializeObject<PointConfig[]>(pointObj);
       for (int i = 0; i < pointConfigs.Length; i++)
       {
            string crossingName_str = pointConfigs[i].ptcrossing.Trim();
            string crossingId_str = pointConfigs[i].ptcrossingId.Trim();
            string cameraId_str = pointConfigs[i].camId.Trim();
            string cameraName_str = pointConfigs[i].cameraName.Trim();
            string dir_str = pointConfigs[i].ptdirection.Trim();
            string i_go_str = pointConfigs[i].ptGoSet.Trim();
            string i_left_str = pointConfigs[i].ptLeftSet.Trim();
            string i_right_str = pointConfigs[i].ptRightSet.Trim();
            string laneName_str = pointConfigs[i].ptname.Trim();
            string main_x_str = pointConfigs[i].ptmainX.Trim();
            string main_y_str = pointConfigs[i].ptmainY.Trim();
            string mainPointValid_str = pointConfigs[i].ptmainvalid.Trim();
            string sub_x_str = pointConfigs[i].ptsubX.Trim();
            string sub_y_str = pointConfigs[i].ptsubY.Trim();
            string subPointValid_str = pointConfigs[i].ptsubvalid.Trim();
            string frame_x_str = pointConfigs[i].ptframediffX.Trim();
            string frame_y_str = pointConfigs[i].ptframediffY.Trim();
            string frameValid_str = pointConfigs[i].ptframediffvalid.Trim();
            string green_x_str = pointConfigs[i].ptgreenlightX.Trim();
            string green_y_str = pointConfigs[i].ptgreenlightY.Trim();
            string red_x_str = pointConfigs[i].ptredlightX.Trim();
            string red_y_str = pointConfigs[i].ptredlightY.Trim();
            string queueValid_str = pointConfigs[i].ptqueuelengthvalid.Trim();
            string calcMathod_str = pointConfigs[i].ptcheckmethod.Trim();
            string channelType_A_str = pointConfigs[i].ptchanneltypeA.Trim();
            string channelTypee_B_str = pointConfigs[i].ptchanneltypeB.Trim();
           string xgr_str = pointConfigs[i].xgr.Trim();
            string xgsj_str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            sb.Append("insert into 

pointConfig(crossingName,crossingId,cameraId,cameraName,dir,i_go,i_left,i_right,laneName,main_x,main_y,mainPointValid,sub_x,sub_y,subPointValid,frame_x,frame_y,frameValid,green_x,green_y,red_x,red_y,queueValid,calcMathod,channelType_A,channelTypee_B,xgr,xgsj) " +
                "values('" + crossingName_str + "','" + crossingId_str + "','" + cameraId_str + "','" + cameraName_str + "','" + dir_str + "','" + i_go_str + "','" + i_left_str + "','" +
                i_right_str + "','" + laneName_str + "','" + main_x_str + "','" + main_y_str + "','" + mainPointValid_str + "','" + sub_x_str + "','" +
                sub_y_str + "','" + subPointValid_str + "','" + frame_x_str + "','" + frame_y_str + "','" + frameValid_str + "','" + green_x_str + "','" + green_y_str + "','" + red_x_str + "','" + red_y_str + "','" + queueValid_str + "','" + calcMathod_str + "','" +
                channelType_A_str + "','" + channelTypee_B_str + "','" + xgr_str + "','" + xgsj_str + "');");
            }
 }

第二种方法:可以这样接收前端传入的jsonArray字符串到一个类的数组中,然后遍历该数组取值

 
 [WebMethod]
    public static string checkPointConfigUpdateRecord(string pointObj)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();

        object[] jsonArray = (object[])serializer.DeserializeObject(pointObj);
        StringBuilder sb = new StringBuilder();
        if (jsonArray.Length<1)
        {
            return "{\"result\":false}";
        }
        for(int i = 0; i < jsonArray.Length; i++)
        {
            object pointConfig = jsonArray[i];
            // 然后将该元素转换为JSON对象
            string json1 = serializer.Serialize(pointConfig);
            Dictionary<string, object> json = (Dictionary<string, object>)serializer.DeserializeObject(json1);

            string crossingName_str = json["ptcrossing"].ToString().Trim();
            string crossingId_str = json["ptcrossingId"].ToString().Trim();
            string cameraId_str = json["camId"].ToString().Trim();
            string cameraName_str = json["cameraName"].ToString().Trim();

            string dir_str = json["ptdirection"].ToString().Trim();
            string i_go_str = json["ptGoSet"].ToString().Trim();
            string i_left_str = json["ptLeftSet"].ToString().Trim();
            string i_right_str = json["ptRightSet"].ToString().Trim();
            string laneName_str = json["ptname"].ToString().Trim();

            string main_x_str = json["ptmainX"].ToString().Trim();
            string main_y_str = json["ptmainY"].ToString().Trim();
            string mainPointValid_str = json["ptmainvalid"].ToString().Trim();

            string sub_x_str = json["ptsubX"].ToString().Trim();
            string sub_y_str = json["ptsubY"].ToString().Trim();
            string subPointValid_str = json["ptsubvalid"].ToString().Trim();

            string frame_x_str = json["ptframediffX"].ToString().Trim();
            string frame_y_str = json["ptframediffY"].ToString().Trim();
            string frameValid_str = json["ptframediffvalid"].ToString().Trim();

            string green_x_str = json["ptgreenlightX"].ToString().Trim();
            string green_y_str = json["ptgreenlightY"].ToString().Trim();
            string red_x_str = json["ptredlightX"].ToString().Trim();
            string red_y_str = json["ptredlightY"].ToString().Trim();
            string queueValid_str = json["ptqueuelengthvalid"].ToString().Trim();



            string calcMathod_str = json["ptcheckmethod"].ToString().Trim();
            string channelType_A_str = json["ptchanneltypeA"].ToString().Trim();
            string channelTypee_B_str = json["ptchanneltypeB"].ToString().Trim();

            string xgr_str = json["xgr"].ToString().Trim();
            string xgsj_str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");


        
            sb.Append("insert into pointConfig(crossingName,crossingId,cameraId,cameraName,dir,i_go,i_left,i_right,laneName,main_x,main_y,mainPointValid,sub_x,sub_y,subPointValid,frame_x,frame_y,frameValid,green_x,green_y,red_x,red_y,queueValid,calcMathod,channelType_A,channelTypee_B,xgr,xgsj) " +
            "values('" + crossingName_str + "','" + crossingId_str + "','" + cameraId_str + "','" + cameraName_str + "','" + dir_str + "','" + i_go_str + "','" + i_left_str + "','" +
            i_right_str + "','" + laneName_str + "','" + main_x_str + "','" + main_y_str + "','" + mainPointValid_str + "','" + sub_x_str + "','" +
            sub_y_str + "','" + subPointValid_str + "','" + frame_x_str + "','" + frame_y_str + "','" + frameValid_str + "','" + green_x_str + "','" + green_y_str + "','" + red_x_str + "','" + red_y_str + "','" + queueValid_str + "','" + calcMathod_str + "','" +
            channelType_A_str + "','" + channelTypee_B_str + "','" + xgr_str + "','" + xgsj_str + "');");

        }

        int jg = SqlHelper.ExecuteNoneQuery(sb.ToString(), new SqlParameter[] { });

        if (jg >= 0)
        {
            return "{\"result\":true}";
        }
        else
        {

            return "{\"result\":false}";
        }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值