Chuyển đổi dữ liệu sang JSON trong C #


87
  1. Tôi muốn lấy các bản ghi từ cơ sở dữ liệu vào a DataTable.
  2. Sau đó chuyển đổi DataTablethành một đối tượng JSON.
  3. Trả lại đối tượng JSON cho hàm JavaScript của tôi.

Tôi sử dụng mã này bằng cách gọi:

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

Để chuyển đổi DataTable thành JSON, nó hoạt động chính xác và trả về như sau:

{
    "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
    }
} 

Nhưng tôi muốn nó trả về như sau:

{"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
}
]} 

Tôi có thể làm cái này như thế nào?


Bài viết hữu ích: 3 cách để chuyển đổi DataTable để JSON trong asp.net c # codepedia.info/2015/07/...
Satinder singh

Có thể có bản sao của DataTable thành JSON
Evan Carroll

Câu trả lời:


193

Đoạn mã này từ Convert Datatable sang JSON String trong C #, VB.NET có thể giúp ích cho bạn. Nó sử dụng System.Web.Script.Serialization.JavaScriptSerializer để tuần tự hóa nội dung sang định dạng 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);
        }
    }
}

nếu tôi có 2 dữ liệu và tôi cần chuyển đổi chúng trong một chuỗi json nhưng tôi cần mỗi dữ liệu trong mảng json thì tôi phải làm gì?
Người dùng7291

@ làm cách nào để thêm dữ liệu này vào bảng
Smith

6
Bạn có thể sử dụng Json.Net thay vì JavaScriptSerializer: return Newtonsoft.Json.JsonConvert.SerializeObject (hàng);
Diego

3
Đối với tôi (.NET Framework 4.5), "Tập lệnh" trong System.Web.Script không được nhận dạng / có thể giải quyết được; cũng không phải là "Serialize" trong "seralizer.Serialize (hàng)"
B. Clay Shannon

73

Chúng ta có thể hoàn thành nhiệm vụ theo hai cách đơn giản, một là sử dụng dll Json.NET và một là sử dụng lớp StringBuilder.

Sử dụng Newtonsoft Json.NET

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

Liên kết tham khảo: Newtonsoft: Chuyển đổi DataTable sang đối tượng JSON trong ASP.Net C #

Sử dụng 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;
    }
}

1
chức năng này hoạt động tốt, nhưng làm thế nào để xử lý dấu ngoặc kép trong trường hàng DataTable.
Pranay Soni

Cách tiếp cận JsonString nhanh gấp đôi so với SerializeObject vì một số lý do ... hiệu suất cũng không tốt lắm trên các tập dữ liệu lớn.
hajikelist

mã này tốt, nhưng sẽ nhanh hơn nhiều nếu đọc dữ liệu trực tiếp từ tham số bảng dữ liệu thay vì tạo một biến khác
ayanix 5:18

Đây không phải là một giải pháp tuyệt vời. Đối với người mới bắt đầu, nếu cơ sở dữ liệu của bạn có bất kỳ giá trị nào có ký tự trích dẫn trong đó - điều này sẽ không thành công. Bạn nên sử dụng JsonTextWriter từ Newtonsoft gói
statictype

using Sử dụng Newtonsoft Json.NET có lẽ là giải pháp đơn giản nhất và tốt nhất IMO
user5328504

28

Điều này có cách tiếp cận tương tự với câu trả lời được chấp nhận, nhưng sử dụng LINQ để chuyển đổi dữ liệu thành danh sách trong một dòng mã.

//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);

Đây là một cách cực kỳ hữu ích để liệt kê một cơ sở dữ liệu, thông thường sẽ tốn rất nhiều mã hóa! Dưới đây là một số biến thể:

//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"))
 );

Đây là chủ đề đối với câu hỏi ban đầu nhưng vì lợi ích hoàn chỉnh, tôi muốn đề cập rằng nếu bạn chỉ muốn lọc ra các hàng từ một cơ sở dữ liệu hiện có, hãy xem câu trả lời này


Giả sử tôi đã sử dụng mã này, tôi sẽ đặt gì trên Chế độ xem để hiển thị dữ liệu json?
Jamie

1
Đó là một câu hỏi rất mở. Bạn có thể sử dụng một số Khung JavaScript và công cụ để phân tích cú pháp dữ liệu được gửi đến chế độ xem. JQgrid chẳng hạn. Hoặc bạn có thể sử dụng JavaScript để phân tích cú pháp danh sách bằng Vòng lặp Đối với và tạo bảng theo cách thủ công với html. Trong ví dụ cuối cùng của tôi malesover21, tôi đã nối kết quả thành một chuỗi. Bạn có thể tạo một bảng hoặc danh sách html trong C # và chỉ cần trả lại nội dung.
Vijay Jagdale

Được rồi cảm ơn. Tôi đã sử dụng tiện ích tự động điền jquery để hiển thị danh sách. Mã của bạn đã giúp ích rất nhiều, cảm ơn bạn! :)
Jamie

18

Một cách thay thế mà không cần sử dụng trình tuần tự javascript:

    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
Tôi có thể biết tại sao tôi bị từ chối không? Nó là một đoạn mã hoạt động ... Nó đang được sử dụng trong môi trường sản xuất.
Durai Amuthan.H

1
Có thể là do bạn đang tạo cấu trúc JSON theo cách thủ công khi bạn có thể sử dụng cách tiếp cận OO hơn. Nó khá lộn xộn để làm theo cách này.
Josh M.

6
@JoshM. - Câu trả lời của tôi là để chỉ ra một cách nữa để lột da cầy mangut.
Durai Amuthan.H

5
Có điều gì đó nói với tôi rằng một lập trình viên sẽ có thể viết mã nhiều như sử dụng các công cụ của bên thứ ba và viết mã tùy chỉnh có thể tốt hơn so với việc sử dụng một công cụ cồng kềnh cho một thứ đơn giản này.
Adam Heeg

7

Bạn có thể sử dụng theo cách tương tự như được chỉ định bởi Alireza Maddah và nếu bạn muốn sử dụng hai bảng dữ liệu thành một mảng json thì hãy làm theo cách sau:

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);
    }
}
}

Cách tương tự có thể được sử dụng cho bao nhiêu bảng dữ liệu tùy thích.


5

Chuyển đổi dữ liệu sang JSON bằng 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

Hãy thử chức năng tùy chỉnh này.

    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;
    }

Sau khi giải mã mảng của bạn như thế này. var deserializeArray = new JavaScriptSerializer (). Deserialize <dynamic> (desrilizeDashboard);
Hasan Javaid

2

Để truy cập giá trị có thể chuyển đổi trong phương thức Json, hãy làm theo các bước sau:

$.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

Những ngày này rất đơn giản ..

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

Bây giờ Chuyển đổi Json của bạn thành DataTable:

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

Cũng hoạt động cho DataSets ..


1

Tôi có chức năng đơn giản để chuyển đổi dữ liệu sang chuỗi json.

Tôi đã sử dụng Newtonsoft để tạo chuỗi. Tôi không sử dụng Newtonsoft để hoàn toàn tuần tự hóa Datatable. Hãy cẩn thận về điều này.

Có lẽ điều này có thể hữu ích.

 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);
 }

Tôi đã sử dụng mã này. Bạn nhận được loại lỗi nào?
Ecd

bạn không thể sử dụng mã chính xác đó, VÌ nó KHÔNG biên dịch!
Mitch Wheat

Bạn có chắc chắn rằng bạn có không gian tên bên phải quan trọng không? gist.github.com/ecdundar/df123aa2526b72cd8df976423ead8daf
Ecd

gợi ý: item.Add (col.ColumnName, dr [col.ColumnName]? .ToString ());
Mitch Wheat

1

hãy thử cái này (ExtensionMethods):

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);
}

Và sử dụng:

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

1

Với Cinchoo ETL - một thư viện mã nguồn mở, bạn có thể xuất DataTable sang JSON một cách dễ dàng với vài dòng mã

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());

Đầu ra:

{
  "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);

Nếu Bạn cần gửi yêu cầu SQL chung thông qua API WebService, Bạn có thể sử dụng giải pháp của tôi.
Heta77

Nếu Bạn cần gửi yêu cầu SQL chung thông qua API WebService, Bạn có thể sử dụng giải pháp của tôi. class transferDataTable là đối tượng có thể phân biệt được. Đối tượng này sẽ gửi giữa máy khách và máy chủ. Phương thức LoadData (trên Máy chủ) điền đối tượng transferDataTable bằng DataTable. Giá trị DBNull.Value không thể được chuyển qua web.api, sau đó tôi đã thay thế giá trị này bằng null). Sau khi deserilaziton trên Client giá trị null sẽ được thay thế bởi DBNull.Value. Phương thức GetDataTable trên Máy khách đã khôi phục DataTable được gửi bởi api phần còn lại. Nếu đến Lỗi, sau đó khách hàng hiển thị thông báo.
Heta77

Pl chỉnh sửa câu trả lời của bạn và thêm lời giải thích có bản thân
Sahil Mittal

0

Truyền dữ liệu cho phương thức này, nó sẽ trả về chuỗi json.

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

Tôi đang sử dụng chức năng này cho bảng mô tả.
Sử dụng nó sau khi điền dữ liệu

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;
        }

Truy vấn MySQL: "DESCRIBE TableName;"; Đầu ra ví dụ 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":""}
]

Đã thử nghiệm với 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

Tất cả những câu trả lời này thực sự tuyệt vời cho việc di chuyển dữ liệu! Trường hợp chúng không thành công là giữ nguyên loại dữ liệu được di chuyển. Điều này trở thành một vấn đề khi bạn muốn làm những việc như hợp nhất các dữ liệu có vẻ giống nhau. JsonConvertsẽ nhìn vào hàng dữ liệu đầu tiên để xác định kiểu dữ liệu của cột, có thể đoán sai.

Để giải quyết vấn đề này;

  • Nối tiếp DataTableDataColumn định nghĩa trong các đối tượng phản hồi riêng biệt.
  • Hủy thứ tự các DataColumnđịnh nghĩa trong câu trả lời trước khi đọc trong bảng.
  • Hủy số liệu và hợp nhất DataTablebỏ qua lược đồ được xác định bởi Json.

Nghe có vẻ rất nhiều, nhưng chỉ có ba dòng mã bổ sung.

// 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 trở thành;

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

Thay vì để Json xác định các định nghĩa cột thông qua dt = JsonConvert.DeserializeObject<DataTable>(response)chúng ta có thể sử dụng LINQ trên của chúng ta resp.ObjSchemađể tự định nghĩa chúng. Chúng tôi sẽ sử dụng MissingSchemaAction.Ignoređể bỏ qua lược đồ do Json cung cấp.

// 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.