แปลงข้อมูลเป็น JSON ใน C #


87
  1. ฉันต้องการรับบันทึกจากฐานข้อมูลเป็นไฟล์DataTable.
  2. จากนั้นแปลงDataTableเป็นวัตถุ JSON
  3. ส่งคืนวัตถุ JSON ไปยังฟังก์ชัน JavaScript ของฉัน

ฉันใช้รหัสนี้โดยโทร:

string result = JsonConvert.SerializeObject(DatatableToDictionary(queryResult, "Title"), Newtonsoft.Json.Formatting.Indented);

ในการแปลง DataTable เป็น JSON จะทำงานได้อย่างถูกต้องและส่งคืนสิ่งต่อไปนี้:

{
    "1": {
    "viewCount": 703,
    "clickCount": 98
    },
    "2": {
    "viewCount": 509,
    "clickCount": 85
    },
    "3": {
    "viewCount": 578,
    "clickCount": 86
    },
    "4": {
    "viewCount": 737,
    "clickCount": 108
    },
    "5": {
    "viewCount": 769,
    "clickCount": 130
    }
} 

แต่ฉันต้องการส่งคืนสิ่งต่อไปนี้:

{"records":[
{
"Title": 1,
"viewCount": 703,
"clickCount": 98
},
{
"Title": 2,
"viewCount": 509,
"clickCount": 85
},
{
"Title": 3,
"viewCount": 578,
"clickCount": 86
},
{
"Title": 4,
"viewCount": 737,
"clickCount": 108
},
{
"Title": 5,
"viewCount": 769,
"clickCount": 130
}
]} 

ฉันจะทำเช่นนี้ได้อย่างไร?


บทความน่ารู้: 3 วิธีในการแปลง DataTable เป็น JSON ใน asp.net c # codepedia.info/2015/07/…
Satinder singh

อาจทำซ้ำDataTable เป็น JSON
Evan Carroll

คำตอบ:


194

ข้อมูลโค้ดจากการ แปลง Datatable เป็น JSON String ใน C # VB.NETอาจช่วยคุณได้ ใช้System.Web.Script.Serialization.JavaScriptSerializerเพื่อจัดลำดับเนื้อหาเป็นรูปแบบ JSON:

public string ConvertDataTabletoString()
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection("Data Source=SureshDasari;Initial Catalog=master;Integrated Security=true"))
    {
        using (SqlCommand cmd = new SqlCommand("select title=City,lat=latitude,lng=longitude,description from LocationDetails", con))
        {
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;
            foreach (DataRow dr in dt.Rows)
            {
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }
            return serializer.Serialize(rows);
        }
    }
}

ถ้าฉันมีดาต้า 2 ตัวและฉันต้องการแปลงเป็นสตริง json เดียว แต่ฉันต้องการดาต้าเบสแต่ละตัวในอาร์เรย์ json ฉันจะทำอย่างไร?
User7291

จะเพิ่มข้อมูลนี้ลงในตารางได้อย่างไร
Smith

6
คุณสามารถใช้ Json.Net แทน JavaScriptSerializer: return Newtonsoft.Json.JsonConvert.SerializeObject (แถว);
Diego

3
สำหรับฉัน (.NET Framework 4.5) "สคริปต์" ใน System.Web.Script ไม่เป็นที่รู้จัก / แก้ไขได้ ไม่ใช่ "Serialize" ใน "seralizer.Serialize (แถว)"
B. Clay Shannon

73

เราสามารถทำงานให้สำเร็จได้ด้วยวิธีง่ายๆสองวิธีวิธีหนึ่งคือการใช้ Json.NET dll และอีกวิธีหนึ่งคือการใช้คลาส StringBuilder

ใช้ Newtonsoft Json.NET

string JSONresult;
JSONresult = JsonConvert.SerializeObject(dt);  
Response.Write(JSONresult);

ลิงค์อ้างอิง: Newtonsoft: แปลง DataTable เป็น JSON object ใน ASP.Net C #

ใช้ StringBuilder

public string DataTableToJsonObj(DataTable dt)
{
    DataSet ds = new DataSet();
    ds.Merge(dt);
    StringBuilder JsonString = new StringBuilder();
    if (ds != null && ds.Tables[0].Rows.Count > 0)
    {
        JsonString.Append("[");
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            JsonString.Append("{");
            for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
            {
                if (j < ds.Tables[0].Columns.Count - 1)
                {
                    JsonString.Append("\"" + ds.Tables[0].Columns[j].ColumnName.ToString() + "\":" + "\"" + ds.Tables[0].Rows[i][j].ToString() + "\",");
                }
                else if (j == ds.Tables[0].Columns.Count - 1)
                {
                    JsonString.Append("\"" + ds.Tables[0].Columns[j].ColumnName.ToString() + "\":" + "\"" + ds.Tables[0].Rows[i][j].ToString() + "\"");
                }
            }
            if (i == ds.Tables[0].Rows.Count - 1)
            {
                JsonString.Append("}");
            }
            else
            {
                JsonString.Append("},");
            }
        }
        JsonString.Append("]");
        return JsonString.ToString();
    }
    else
    {
        return null;
    }
}

2
ฟังก์ชั่นนี้ใช้งานได้ดี แต่วิธีจัดการใบเสนอราคาคู่ในฟิลด์แถว DataTable
Pranay Soni

วิธี JsonString นั้นเร็วกว่า SerializeObject ประมาณสองเท่าด้วยเหตุผลบางประการ ... ประสิทธิภาพยังไม่ค่อยดีนักในชุดข้อมูลขนาดใหญ่
hajikelist

รหัสนี้ดี แต่จะเร็วกว่ามากในการอ่านข้อมูลโดยตรงจากพารามิเตอร์ตารางข้อมูลแทนที่จะสร้างตัวแปรอื่น
ayanix

นี่ไม่ใช่วิธีแก้ปัญหาที่ดี สำหรับผู้เริ่มต้นหากฐานข้อมูลของคุณมีค่าใด ๆ ที่มีเครื่องหมายคำพูดอยู่การดำเนินการนี้จะล้มเหลว คุณดีกว่าที่จะใช้ JsonTextWriter จากแพ็คเกจ
Newtonsoft

การใช้การใช้ Newtonsoft Json.NET น่าจะเป็น IMO ที่ง่ายและดีที่สุด
user5328504

28

วิธีนี้มีแนวทางคล้ายกับคำตอบที่ยอมรับ แต่ใช้ LINQ เพื่อแปลงข้อมูลเป็นรายการในโค้ดบรรทัดเดียว

//convert datatable to list using LINQ. Input datatable is "dt", returning list of "name:value" tuples
var lst = dt.AsEnumerable()
    .Select(r => r.Table.Columns.Cast<DataColumn>()
            .Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal])
           ).ToDictionary(z=>z.Key,z=>z.Value)
    ).ToList();
//now serialize it
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return serializer.Serialize(lst);

นี่เป็นวิธีที่มีประโยชน์อย่างเหลือเชื่อในการระบุข้อมูลซึ่งโดยปกติจะใช้เวลาในการเข้ารหัสเป็นจำนวนมาก! นี่คือรูปแบบบางส่วน:

//convert to list with array of values for each row
var list1 = dt.AsEnumerable().Select(r => r.ItemArray.ToList()).ToList();

//convert to list of first column values only
var list2 = dt.AsEnumerable().Select(r => r.ItemArray[0]).ToList();

// parse a datatable with conditions and get CSV string
string MalesOver21 = string.Join(",",
    dt.AsEnumerable()
      .Where(r => r["GENDER"].ToString()=="M" && r.Field<int>("AGE")>21)
      .Select(r => r.Field<string>("FULLNAME"))
 );

นี่ไม่ใช่หัวข้อสำหรับคำถามเดิม แต่เพื่อความสมบูรณ์ฉันพูดถึงว่าหากคุณต้องการกรองแถวจากข้อมูลที่มีอยู่ดูคำตอบนี้


สมมติว่าฉันใช้รหัสนี้ฉันจะใส่อะไรใน View เพื่อแสดงข้อมูล json
Jamie

1
นั่นเป็นคำถามปลายเปิดมาก คุณสามารถใช้ JavaScript Framework และเครื่องมือต่างๆเพื่อแยกวิเคราะห์ข้อมูลที่ส่งไปยังมุมมอง ตัวอย่างเช่น JQgrid หรือคุณสามารถใช้ JavaScript เพื่อแยกวิเคราะห์รายการโดยใช้ For Loop และสร้างตารางด้วยตัวเองด้วย html ในตัวอย่างล่าสุดของฉัน Maleover21 ฉันต่อผลลัพธ์เป็นสตริง คุณสามารถสร้างตารางหรือรายการ html ใน C # และส่งคืนเนื้อหา
Vijay Jagdale

โอเคขอบคุณ. ฉันลงเอยด้วยการใช้วิดเจ็ตเติมข้อความอัตโนมัติ jquery เพื่อแสดงรายการ รหัสของคุณช่วยได้มากขอบคุณ! :)
Jamie

18

ทางเลือกอื่นโดยไม่ต้องใช้ javascript serializer:

    public static string DataTableToJSON(DataTable Dt)
            {
                string[] StrDc = new string[Dt.Columns.Count];

                string HeadStr = string.Empty;
                for (int i = 0; i < Dt.Columns.Count; i++)
                {

                    StrDc[i] = Dt.Columns[i].Caption;
                    HeadStr += "\"" + StrDc[i] + "\":\"" + StrDc[i] + i.ToString() + "¾" + "\",";

                }

                HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);

                StringBuilder Sb = new StringBuilder();

                Sb.Append("[");

                for (int i = 0; i < Dt.Rows.Count; i++)
                {

                    string TempStr = HeadStr;

                    for (int j = 0; j < Dt.Columns.Count; j++)
                    {

                        TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString().Trim());
                    }
                    //Sb.AppendFormat("{{{0}}},",TempStr);

                    Sb.Append("{"+TempStr + "},");
                }

                Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));

                if(Sb.ToString().Length>0)
                Sb.Append("]");

                return StripControlChars(Sb.ToString());

            }
//To strip control characters:

//A character that does not represent a printable character but //serves to initiate a particular action.

            public static string StripControlChars(string s)
            {
                return Regex.Replace(s, @"[^\x20-\x7F]", "");
            }

1
ฉันขอทราบเหตุผลที่ฉันถูกลดคะแนนได้หรือไม่? มันเป็นข้อมูลโค้ดที่ใช้งานได้ ... มันถูกใช้ในสภาพแวดล้อมการผลิต
Durai Amuthan.H

1
อาจเป็นเพราะคุณกำลังสร้างโครงสร้าง JSON ด้วยตนเองเมื่อคุณสามารถใช้แนวทาง OO ได้มากขึ้น มันค่อนข้างยุ่งมากที่จะทำด้วยวิธีนี้
Josh M.

6
@ จอช. - คำตอบของฉันมีไว้เพื่อแสดงอีกวิธีหนึ่งในการถลกหนังพังพอน
Durai Amuthan.H

5
มีบางอย่างบอกฉันว่าโปรแกรมเมอร์ควรจะเขียนโค้ดได้พอ ๆ กับการใช้เครื่องมือของบุคคลที่สามและการเขียนโค้ดแบบกำหนดเองจะดีกว่าการใช้เครื่องมือแบบป่องสำหรับสิ่งง่ายๆนี้
Adam Heeg

7

คุณสามารถใช้วิธีเดียวกับที่ระบุโดย Alireza Maddah และถ้าคุณต้องการใช้ตารางข้อมูลสองตารางในอาร์เรย์ json เดียวต่อไปนี้:

public string ConvertDataTabletoString()
{
DataTable dt = new DataTable();
DataTable dt1 = new DataTable();
using (SqlConnection con = new SqlConnection("Data Source=SureshDasari;Initial Catalog=master;Integrated Security=true"))
{
    using (SqlCommand cmd = new SqlCommand("select title=City,lat=latitude,lng=longitude,description from LocationDetails", con))
    {
        con.Open();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row;
        foreach (DataRow dr in dt.Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn col in dt.Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }
            rows.Add(row);
        }
        SqlCommand cmd1 = new SqlCommand("_another_query_", con);
                SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
                da1.Fill(dt1);
                System.Web.Script.Serialization.JavaScriptSerializer serializer1 = new System.Web.Script.Serialization.JavaScriptSerializer();
                Dictionary<string, object> row1;
                foreach (DataRow dr in dt1.Rows) //use the old variable rows only
                {
                    row1 = new Dictionary<string, object>();
                    foreach (DataColumn col in dt1.Columns)
                    {
                        row1.Add(col.ColumnName, dr[col]);
                    }
                    rows.Add(row1); // Finally You can add into old json array in this way
                }
        return serializer.Serialize(rows);
    }
}
}

วิธีเดียวกันนี้สามารถใช้กับตารางข้อมูลได้มากเท่าที่คุณต้องการ


5

แปลงข้อมูลเป็น JSON โดยใช้ C # .net

 public static object DataTableToJSON(DataTable table)
    {
        var list = new List<Dictionary<string, object>>();

        foreach (DataRow row in table.Rows)
        {
            var dict = new Dictionary<string, object>();

            foreach (DataColumn col in table.Columns)
            {
                dict[col.ColumnName] = (Convert.ToString(row[col]));
            }
            list.Add(dict);
        }
        JavaScriptSerializer serializer = new JavaScriptSerializer();

        return serializer.Serialize(list);
    }

3

ลองใช้ฟังก์ชันที่กำหนดเองนี้

    public static string DataTableToJsonObj(DataTable dt)
    {
        DataSet ds = new DataSet();
        ds.Merge(dt);
        StringBuilder jsonString = new StringBuilder();

        if (ds.Tables[0].Rows.Count > 0)
        {
            jsonString.Append("[");
            for (int rows = 0; rows < ds.Tables[0].Rows.Count; rows++)
            {
                jsonString.Append("{");
                for (int cols = 0; cols < ds.Tables[0].Columns.Count; cols++)
                {
                    jsonString.Append(@"""" + ds.Tables[0].Columns[cols].ColumnName + @""":");

                    /* 
                    //IF NOT LAST PROPERTY

                    if (cols < ds.Tables[0].Columns.Count - 1)
                    {
                        GenerateJsonProperty(ds, rows, cols, jsonString);
                    }

                    //IF LAST PROPERTY

                    else if (cols == ds.Tables[0].Columns.Count - 1)
                    {
                        GenerateJsonProperty(ds, rows, cols, jsonString, true);
                    }
                    */

                    var b = (cols < ds.Tables[0].Columns.Count - 1)
                        ? GenerateJsonProperty(ds, rows, cols, jsonString)
                        : (cols != ds.Tables[0].Columns.Count - 1)
                          || GenerateJsonProperty(ds, rows, cols, jsonString, true);
                }
                jsonString.Append(rows == ds.Tables[0].Rows.Count - 1 ? "}" : "},");
            }
            jsonString.Append("]");
            return jsonString.ToString();
        }
        return null;
    }

    private static bool GenerateJsonProperty(DataSet ds, int rows, int cols, StringBuilder jsonString, bool isLast = false)
    {

        // IF LAST PROPERTY THEN REMOVE 'COMMA'  IF NOT LAST PROPERTY THEN ADD 'COMMA'
        string addComma = isLast ? "" : ",";

        if (ds.Tables[0].Rows[rows][cols] == DBNull.Value)
        {
            jsonString.Append(" null " + addComma);
        }
        else if (ds.Tables[0].Columns[cols].DataType == typeof(DateTime))
        {
            jsonString.Append(@"""" + (((DateTime)ds.Tables[0].Rows[rows][cols]).ToString("yyyy-MM-dd HH':'mm':'ss")) + @"""" + addComma);
        }
        else if (ds.Tables[0].Columns[cols].DataType == typeof(string))
        {
            jsonString.Append(@"""" + (ds.Tables[0].Rows[rows][cols]) + @"""" + addComma);
        }
        else if (ds.Tables[0].Columns[cols].DataType == typeof(bool))
        {
            jsonString.Append(Convert.ToBoolean(ds.Tables[0].Rows[rows][cols]) ? "true" : "fasle");
        }
        else
        {
            jsonString.Append(ds.Tables[0].Rows[rows][cols] + addComma);
        }

        return true;
    }

หลังจากนี้ Deserialize Array ของคุณเช่นนี้ var deserializeArray = JavaScriptSerializer ใหม่ (). Deserialize <dynamic> (desrilizeDashboard);
Hasan Javaid

2

ในการเข้าถึงค่าแปลงข้อมูลในวิธี Json ให้ทำตามขั้นตอนด้านล่าง:

$.ajax({
        type: "POST",
        url: "/Services.asmx/YourMethodName",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            var parsed = $.parseJSON(data.d);
            $.each(parsed, function (i, jsondata) {
            $("#dividtodisplay").append("Title: " + jsondata.title + "<br/>" + "Latitude: " + jsondata.lat);
            });
        },
        error: function (XHR, errStatus, errorThrown) {
            var err = JSON.parse(XHR.responseText);
            errorMessage = err.Message;
            alert(errorMessage);
        }
    });

2

ง่ายมากวันนี้ ..

string json = JsonConvert.SerializeObject(YourDataTable, Formatting.Indented);

ตอนนี้แปลง Json ของคุณเป็น DataTable:

YourDataTable = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));

ใช้ได้กับ DataSets เช่นกัน ..


1

ฉันมีฟังก์ชันง่ายๆในการแปลง datatable เป็นสตริง json

ฉันใช้ Newtonsoft เพื่อสร้างสตริง ฉันไม่ได้ใช้ Newtonsoft เพื่อทำให้เป็นอนุกรม Datatable ทั้งหมด ระวังเรื่องนี้

บางทีนี่อาจเป็นประโยชน์

 private string DataTableToJson(DataTable dt) {
  if (dt == null) {
   return "[]";
  };
  if (dt.Rows.Count < 1) {
   return "[]";
  };

  JArray array = new JArray();
  foreach(DataRow dr in dt.Rows) {
   JObject item = new JObject();
   foreach(DataColumn col in dt.Columns) {
    item.Add(col.ColumnName, dr[col.ColumnName]?.ToString());
   }
   array.Add(item);
  }

  return array.ToString(Newtonsoft.Json.Formatting.Indented);
 }

ฉันใช้รหัสนี้อยู่แล้ว คุณได้รับข้อผิดพลาดประเภทใด
Ecd

คุณไม่สามารถใช้รหัสที่แน่นอนได้เพราะมันไม่ได้รวบรวม!
Mitch Wheat

คุณแน่ใจหรือไม่ว่าคุณมีเนมสเปซที่ถูกต้อง gist.github.com/ecdundar/df123aa2526b72cd8df976423ead8daf
Ecd

คำใบ้: item.Add (col.ColumnName, dr [col.ColumnName]? .ToString ());
Mitch Wheat

1

ลองสิ่งนี้ (วิธีการขยาย):

public static string ToJson(this DataTable dt)
{
    List<Dictionary<string, object>> lst = new List<Dictionary<string, object>>();
    Dictionary<string, object> item;
    foreach (DataRow row in dt.Rows)
    {
            item = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    item.Add(col.ColumnName, (Convert.IsDBNull(row[col]) ? null : row[col]));       
        }
        lst.Add(item);
    }
        return Newtonsoft.Json.JsonConvert.SerializeObject(lst);
}

และใช้:

DataTable dt = new DataTable();
.
.
.
var json = dt.ToJson();

1

ด้วยCinchoo ETL - ไลบรารีโอเพ่นซอร์สคุณสามารถส่งออก DataTable ไปยัง JSON ได้อย่างง่ายดายด้วยโค้ดเพียงไม่กี่บรรทัด

StringBuilder sb = new StringBuilder();
string connectionstring = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Northwind;Integrated Security=True";
using (var conn = new SqlConnection(connectionstring))
{
    conn.Open();
    var comm = new SqlCommand("SELECT * FROM Customers", conn);
    SqlDataAdapter adap = new SqlDataAdapter(comm);

    DataTable dt = new DataTable("Customer");
    adap.Fill(dt);

    using (var parser = new ChoJSONWriter(sb))
        parser.Write(dt);
}

Console.WriteLine(sb.ToString());

เอาท์พุต:

{
  "Customer": [
    {
      "CustomerID": "ALFKI",
      "CompanyName": "Alfreds Futterkiste",
      "ContactName": "Maria Anders",
      "ContactTitle": "Sales Representative",
      "Address": "Obere Str. 57",
      "City": "Berlin",
      "Region": null,
      "PostalCode": "12209",
      "Country": "Germany",
      "Phone": "030-0074321",
      "Fax": "030-0076545"
    },
    {
      "CustomerID": "ANATR",
      "CompanyName": "Ana Trujillo Emparedados y helados",
      "ContactName": "Ana Trujillo",
      "ContactTitle": "Owner",
      "Address": "Avda. de la Constitución 2222",
      "City": "México D.F.",
      "Region": null,
      "PostalCode": "05021",
      "Country": "Mexico",
      "Phone": "(5) 555-4729",
      "Fax": "(5) 555-3745"
    }
  ]
}

0
public static string ConvertIntoJson(DataTable dt)
{
    var jsonString = new StringBuilder();
    if (dt.Rows.Count > 0)
    {
        jsonString.Append("[");
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            jsonString.Append("{");
            for (int j = 0; j < dt.Columns.Count; j++)
                jsonString.Append("\"" + dt.Columns[j].ColumnName + "\":\"" 
                    + dt.Rows[i][j].ToString().Replace('"','\"') + (j < dt.Columns.Count - 1 ? "\"," : "\""));

            jsonString.Append(i < dt.Rows.Count - 1 ? "}," : "}");
        }
        return jsonString.Append("]").ToString();
    }
    else
    {
        return "[]";
    }
}
public static string ConvertIntoJson(DataSet ds)
{
    var jsonString = new StringBuilder();
    jsonString.Append("{");
    for (int i = 0; i < ds.Tables.Count; i++)
    {
        jsonString.Append("\"" + ds.Tables[i].TableName + "\":");
        jsonString.Append(ConvertIntoJson(ds.Tables[i]));
        if (i < ds.Tables.Count - 1)
            jsonString.Append(",");
    }
    jsonString.Append("}");
    return jsonString.ToString();
}

0
//Common DLL client, server
public class transferDataTable
{
    public class myError
    {
        public string Message { get; set; }
        public int Code { get; set; }
    }

    public myError Error { get; set; }
    public List<string> ColumnNames { get; set; }
    public List<string> DataTypes { get; set; }
    public List<Object> Data { get; set; }
    public int Count { get; set; }
}

public static class ExtensionMethod
{
    public static transferDataTable LoadData(this transferDataTable transfer, DataTable dt)
    {
        if (dt != null)
        {
            transfer.DataTypes = new List<string>();
            transfer.ColumnNames = new List<string>();                
            foreach (DataColumn c in dt.Columns)
            {
                transfer.ColumnNames.Add(c.ColumnName);
                transfer.DataTypes.Add(c.DataType.ToString());
            }

            transfer.Data = new List<object>();
            foreach (DataRow dr in dt.Rows)
            {
                foreach (DataColumn col in dt.Columns)
                {
                    transfer.Data.Add(dr[col] == DBNull.Value ? null : dr[col]);
                }
            }
            transfer.Count = dt.Rows.Count;
        }            
        return transfer;
    }        

    public static DataTable GetDataTable(this transferDataTable transfer, bool ConvertToLocalTime = true)
    {
        if (transfer.Error != null || transfer.ColumnNames == null || transfer.DataTypes == null || transfer.Data == null)
            return null;

        int columnsCount = transfer.ColumnNames.Count;
        DataTable dt = new DataTable();
        for (int i = 0; i < columnsCount; i++ )
        {
            Type colType = Type.GetType(transfer.DataTypes[i]);
            dt.Columns.Add(new DataColumn(transfer.ColumnNames[i], colType));
        }

        int index = 0;
        DataRow row = dt.NewRow();
        foreach (object o in transfer.Data)
        {
            if (ConvertToLocalTime && o != null && o.GetType() == typeof(DateTime))
            {
                DateTime dat = Convert.ToDateTime(o);
                row[index] = dat.ToLocalTime();
            }
            else
                row[index] = o == null ? DBNull.Value : o;

            index++;

            if (columnsCount == index)
            {
                index = 0;
                dt.Rows.Add(row);
                row = dt.NewRow();
            }
        }
        return dt;
    }
}

//Server
    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "json/data")]
    transferDataTable _Data();

    public transferDataTable _Data()
    {
        try
        {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["myConnString"]))
            {
                con.Open();
                DataSet ds = new DataSet();
                SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM tbGalleries", con);
                myAdapter.Fill(ds, "table");
                DataTable dt = ds.Tables["table"];
                return new transferDataTable().LoadData(dt);
            }
        }
        catch(Exception ex)
        {
            return new transferDataTable() { Error = new transferDataTable.myError() { Message = ex.Message, Code = ex.HResult } };
        }
    }

//Client
        Response = Vossa.getAPI(serviceUrl + "json/data");
        transferDataTable transfer = new JavaScriptSerializer().Deserialize<transferDataTable>(Response);
        if (transfer.Error == null)
        {
            DataTable dt = transfer.GetDataTable();
            dbGrid.ItemsSource = dt.DefaultView;
        }
        else
            MessageBox.Show(transfer.Error.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);

หากคุณต้องการส่งคำขอ SQL ทั่วไปเพื่อแก้ไข WebService API คุณสามารถใช้โซลูชันของฉันได้
Heta77

หากคุณต้องการส่งคำขอ SQL ทั่วไปเพื่อแก้ไข WebService API คุณสามารถใช้โซลูชันของฉันได้ class transferDataTable เป็นอ็อบเจ็กต์ seriazible วัตถุนี้จะส่งระหว่างไคลเอนต์และเซิร์ฟเวอร์ วิธี LoadData (บนเซิร์ฟเวอร์) เติม object transferDataTable ด้วย DataTable ไม่สามารถโอนค่า DBNull.Value ผ่าน web.api ได้ฉันจึงแทนที่ค่านี้ด้วย null) หลังจาก deserilaziton บน Client null value จะถูกแทนที่ด้วย DBNull.Value เมธอด GetDataTable บน Client ที่เรียกคืน DataTable ที่ส่งโดย rest api หากเกิดข้อผิดพลาดไคลเอ็นต์จะแสดงข้อความ
Heta77

โปรดแก้ไขคำตอบของคุณและเพิ่มคำอธิบายที่นั่น
Sahil Mittal

0

ส่ง datable ไปยังวิธีนี้มันจะส่งคืน json String

public DataTable GetTable()
        {
            string str = "Select * from GL_V";
            OracleCommand cmd = new OracleCommand(str, con);
            cmd.CommandType = CommandType.Text;
            DataTable Dt = OracleHelper.GetDataSet(con, cmd).Tables[0];

            return Dt;
        }

        public string DataTableToJSONWithJSONNet(DataTable table)
        {
            string JSONString = string.Empty;
            JSONString = JsonConvert.SerializeObject(table);
            return JSONString;
        }



public static DataSet GetDataSet(OracleConnection con, OracleCommand cmd)
        {
            // create the data set  
            DataSet ds = new DataSet();
            try
            {
                //checking current connection state is open
                if (con.State != ConnectionState.Open)
                    con.Open();

                // create a data adapter to use with the data set
                OracleDataAdapter da = new OracleDataAdapter(cmd);

                // fill the data set
                da.Fill(ds);
            }
            catch (Exception ex)
            {

                throw;
            }
            return ds;
        }

0

ฉันใช้ฟังก์ชันนี้เพื่ออธิบายตาราง
ใช้หลังจากเติมข้อมูลได้แล้ว

static public string DataTableToJSON(DataTable dataTable,bool readableformat=true)
        {
            string JSONString="[";
            string JSONRow;
            string colVal;
            foreach(DataRow dataRow in dataTable.Rows)
            {
                if(JSONString!="[") { JSONString += ","; }
                JSONRow = "";
                if (readableformat) { JSONRow += "\r\n"; }
                JSONRow += "{";

                foreach (DataColumn col in dataTable.Columns)
                {
                    colVal = dataRow[col].ToString();
                    colVal = colVal.Replace("\"", "\\\"");
                    colVal = colVal.Replace("'", "\\\'");
                    if(JSONRow!="{"&&JSONRow!="\r\n{") {

                        JSONRow += ",";

                    }
                    JSONRow += "\"" + col.ColumnName + "\":\"" + colVal + "\"";

                }
                JSONRow += "}";
                JSONString += JSONRow;
            }
            JSONString += "\r\n]";
            return JSONString;
        }

MySQL Query: "รายละเอียด TableName;"; DataTableToJSON (dataTable) ตัวอย่างผลลัพธ์:

[
{"Field":"id","Type":"int(5)","Null":"NO","Key":"PRI","Default":"","Extra":"auto_increment"},
{"Field":"ad","Type":"int(11) unsigned","Null":"NO","Key":"MUL","Default":"","Extra":""},
{"Field":"soyad","Type":"varchar(20)","Null":"YES","Key":"","Default":"","Extra":""},
{"Field":"ulke","Type":"varchar(20)","Null":"YES","Key":"","Default":"","Extra":""},
{"Field":"alan","Type":"varchar(20)","Null":"YES","Key":"","Default":"","Extra":""},
{"Field":"numara","Type":"varchar(20)","Null":"NO","Key":"","Default":"","Extra":""}
]

ทดสอบด้วย PHP:

$X='[
{"Field":"id","Type":"int(5)","Null":"NO","Key":"PRI","Default":"","Extra":"auto_increment"},
{"Field":"ad","Type":"int(11) unsigned","Null":"NO","Key":"MUL","Default":"","Extra":""},
{"Field":"soyad","Type":"varchar(20)","Null":"YES","Key":"","Default":"","Extra":""},
{"Field":"ulke","Type":"varchar(20)","Null":"YES","Key":"","Default":"","Extra":""},
{"Field":"alan","Type":"varchar(20)","Null":"YES","Key":"","Default":"","Extra":""},
{"Field":"numara","Type":"varchar(20)","Null":"NO","Key":"","Default":"","Extra":""}
]';
$Y=json_decode($X,true);
echo $Y[0]["Field"];
var_dump($Y);

0

คำตอบทั้งหมดนี้ยอดเยี่ยมมากสำหรับการย้ายข้อมูล! ในกรณีที่ล้มเหลวคือการรักษาประเภทคอลัมน์ของข้อมูลที่จะย้าย สิ่งนี้จะกลายเป็นปัญหาเมื่อคุณต้องการทำสิ่งต่างๆเช่นผสานข้อมูลที่ดูเหมือนจะเหมือนกัน JsonConvertจะดูข้อมูลแถวแรกเพื่อกำหนดประเภทข้อมูลคอลัมน์ซึ่งอาจเดาไม่ถูกต้อง

เพื่อหลีกเลี่ยงสิ่งนี้

  • ทำให้อนุกรมDataTableและDataColumnนิยามในอ็อบเจ็กต์การตอบสนองแยกต่างหาก
  • DataColumnกำหนดค่าเริ่มต้นของคำจำกัดความในการตอบกลับก่อนอ่านในตาราง
  • Deserialize และผสานการDataTableละเว้น schema ที่กำหนดโดย Json

ดูเหมือนจะมาก แต่มีโค้ดเพิ่มเติมเพียงสามบรรทัดเท่านั้น

// Get our Column definitions and serialize them using an anoymous function.
var columns = dt.Columns.Cast<DataColumn>().Select(c => new { DataPropertyName = c.ColumnName, DataPropertyType = c.DataType.ToString()});
resp.ObjSchema = JsonConvert.SerializeObject(columns);
resp.Obj = JsonConvert.SerializeObject(dt);

resp.ObjSchema กลายเป็น;

[
  {
    "DataPropertyName": "RowId",
    "DataPropertyType ": "System.Int32"
  },
  {
    "DataPropertyName": "ItemName",
    "DataPropertyType ": "System.String"
  }
]

แทนที่จะปล่อยให้ Json กำหนดนิยามคอลัมน์ผ่านทางdt = JsonConvert.DeserializeObject<DataTable>(response)เราสามารถใช้ LINQ กับเราresp.ObjSchemaเพื่อกำหนดด้วยตัวเอง เราจะใช้MissingSchemaAction.Ignoreเพื่อละเว้นสคีมาที่ Json ให้ไว้

// If your environment does not support dynamic you'll need to create a class for with DataPropertyName and DataPropertyType.
JsonConvert.DeserializeObject<List<dynamic>>(response.ObjSchema).ForEach(prop =>
{
    dt.Columns.Add(new DataColumn() { ColumnName = prop.DataPropertyName, DataType = Type.GetType(prop.DataPropertyType.ToString()) });
});
// Merge the results ignoring the JSON schema.
dt.Merge(JsonConvert.DeserializeObject<DataTable>(response.Obj), true, MissingSchemaAction.Ignore);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.