C # में JSON के लिए परिवर्तित करने योग्य


87
  1. मैं डेटाबेस से एक में रिकॉर्ड प्राप्त करना चाहता हूं DataTable
  2. फिर DataTableJSON ऑब्जेक्ट में परिवर्तित करें ।
  3. JSON ऑब्जेक्ट को मेरे जावास्क्रिप्ट फ़ंक्शन पर लौटें।

मैं कॉल करके इस कोड का उपयोग करता हूं :

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

JSON के लिए एक DataTable कन्वर्ट करने के लिए, यह सही ढंग से काम करता है और निम्नलिखित लौटाता है:

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

मैं यह कैसे कर सकता हूँ?


उपयोगी लेख: डेटाटेबल
singh

जवाबों:


193

C #, VB.NET में कन्वर्ट डिटैटेबल से JSON स्ट्रिंग तक यह कोड स्निपेट आपकी मदद कर सकता है। JSON प्रारूप में सामग्री को क्रमांकित करने के लिए यह System.Web.Script.Serialization.JavaScriptSerializer का उपयोग करता है :

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 ऐरे में प्रत्येक डेटाटेबल की आवश्यकता है तो मैं क्या करूँगा?
User7291

@ एक टेबल पर इस डेटा को कैसे जोड़ते हैं
स्मिथ

6
आप जावास्क्रिप्ट के बदले Json.Net का उपयोग कर सकते हैं: Newtonsoft.Json.JsonConvert.SerializeObject (पंक्तियाँ);
डिएगो

3
मेरे लिए (.NET फ्रेमवर्क 4.5), System.Web.Script में "स्क्रिप्ट" मान्यता प्राप्त / resolvable नहीं है; न ही "सीरलाइज़र" में "सीरलाइज़र। सीरीज़लाइज़ (पंक्तियाँ)" है
बी क्ले शैनन

73

हम कार्य को दो सरल तरीके से पूरा कर सकते हैं एक Json.NET dll का उपयोग कर रहा है और दूसरा StringBuilder वर्ग का उपयोग करके है।

Newtonsoft Json.NET का उपयोग करना

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

संदर्भ लिंक: न्यूटनसॉफ्ट : एएसटी.नेट सी # में JSON ऑब्जेक्ट के लिए डेटाटेबल कन्वर्ट करें

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
यह फ़ंक्शन ठीक है, लेकिन डेटाटेबल पंक्ति फ़ील्ड में दोहरे उद्धरण को कैसे संभालना है।
प्रणय सोनी

JsonString दृष्टिकोण किसी कारण से SerializeObject के रूप में दो बार के बारे में उपवास है ... प्रदर्शन बड़े डेटासेट पर भी बहुत अच्छा नहीं है।
हजिकेलिस्ट

यह कोड अच्छा है, लेकिन यह एक और चर बनाने के बजाय डेटा तालिका पैरामीटर से सीधे डेटा को पढ़ने के लिए बहुत तेज़ होगा
ayanix

यह एक महान समाधान नहीं है। शुरुआत के लिए, यदि आपके डेटाबेस में कोई मान है, जिसमें उद्धरण चिह्नों हैं - यह विफल हो जाएगा। आप न्यूटनसॉफ्ट पैकेज से JsonTextWriter का उपयोग करने से बेहतर हैं
स्टेटिकटाइप

Newtonsoft Json.NET का उपयोग करना संभवतः सबसे सरल और सबसे अच्छा समाधान IMO है
user5328504

28

यह स्वीकृत उत्तर के समान है, लेकिन कोड की एकल पंक्ति में सूची के लिए datatable परिवर्तित करने के लिए 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"))
 );

यह मूल प्रश्न के लिए विषय है, लेकिन पूर्णता के लिए, मैं उल्लेख करता हूं कि यदि आप मौजूदा मौजूदा डेटा से पंक्तियों को फ़िल्टर करना चाहते हैं, यह उत्तर देखें


यह मानते हुए कि मैंने इस कोड का उपयोग किया है, मैं json डेटा दिखाने के लिए View पर क्या डालूंगा?
जेमी

1
यह एक बहुत खुला सवाल है। दृश्य में भेजे गए डेटा को पार्स करने के लिए आप कई जावास्क्रिप्ट फ्रेमवर्क और टूल का उपयोग कर सकते हैं। उदाहरण के लिए JQgrid। या आप फ़ोर लूप का उपयोग करके सूची को पार्स करने के लिए जावास्क्रिप्ट का उपयोग कर सकते हैं और मैन्युअल रूप से HTML के साथ एक तालिका का निर्माण कर सकते हैं। मेरे अंतिम उदाहरण malesover21 में, मैंने परिणाम को एक स्ट्रिंग में बदल दिया। आप सी # में एक html तालिका या सूची बना सकते हैं और केवल सामग्री वापस कर सकते हैं।
विजय जगदाले

ठीक है धन्यवाद। मैंने सूची दिखाने के लिए jquery स्वतः पूर्ण विजेट का उपयोग कर समाप्त किया। आपके कोड ने बहुत मदद की, धन्यवाद! :)
जेमी

18

जावास्क्रिप्ट धारावाहिक का उपयोग किए बिना एक वैकल्पिक तरीका:

    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
क्या मुझे पता है कि मुझे क्यों अपमानित किया जा रहा है? इसका काम कोड-स्निपेट है ... इसका उपयोग उत्पादन वातावरण में किया जा रहा है।
दुरई अमुथन

1
संभवतः क्योंकि आप मैन्युअल रूप से एक JSON संरचना बना रहे हैं जब आप एक अधिक OO दृष्टिकोण का उपयोग कर सकते हैं। यह इस तरह से करना बहुत गड़बड़ है।
जोश एम।

6
@JoshM। - मेरा जवाब मुंगोज़ को स्किन करने का एक और तरीका दिखाने के लिए है।
दुरई अमूथन

5
कुछ मुझे बताता है कि एक प्रोग्रामर को केवल 3 पार्टी टूल्स का उपयोग करने के लिए कोड लिखने में सक्षम होना चाहिए और यह कि कस्टम कोड लिखना इस सरल चीज़ के लिए ब्लोटेड टूल का उपयोग करने से बेहतर हो सकता है।
एडम हीग

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

C # .net का उपयोग करके JSON में डेटा करने योग्य कन्वर्ट करें

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

इसके बाद इस तरह से अपने अर्रे का वर्णन करें। var deserializeArray = नया JavaScriptSerializer ()। Deserialize <गतिशील> (desrilizeDadboard);
हसन जावेद

2

Json विधि में कनवर्ट किए गए datatable मान तक पहुँचने के लिए निम्न चरणों का पालन करें:

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

डेटासेट के लिए भी काम करता है ।।


1

मेरे पास सिंपल फंक्शन को डाएटेबल को जौनस स्ट्रिंग में बदलने के लिए है।

मैंने स्ट्रिंग उत्पन्न करने के लिए न्यूटनसॉफ्ट का उपयोग किया है। मैं डेटाटेबल को क्रमबद्ध करने के लिए न्यूटनसॉफ्ट का उपयोग नहीं करता। इस बारे में सावधान रहें।

शायद यह उपयोगी हो सकता है।

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

मैं पहले से ही इस कोड का उपयोग कर रहा हूं। आपको किस प्रकार की त्रुटि मिलती है?
इक

आप उस सटीक कोड का उपयोग नहीं कर सकते, क्योंकि यह संकलन नहीं है!
मिच गेहूं

क्या आप सुनिश्चित हैं कि आपके पास महत्वपूर्ण सही नामस्थान हैं? gist.github.com/ecdundar/df123aa2526b72cd8df976423ead8daf
Ecd

संकेत: item.Add (col.ColumnName, dr [col.ColumnName]; .ToString ());
मिच गेहूं

1

इसे आज़माएँ (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);
}

और उपयोग करें:

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

1

सिनचू ईटीएल के साथ - एक खुला स्रोत पुस्तकालय, आप कोड की कुछ पंक्तियों के साथ आसानी से 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);

यदि आपको सामान्य एसक्यूएल अनुरोध भेजने की आवश्यकता है, तो वेबसर्विस एपीआई, आप मेरे समाधान का उपयोग कर सकते हैं।
हेटन 7

यदि आपको सामान्य एसक्यूएल अनुरोध भेजने की आवश्यकता है, तो आप वेब समाधान सेवा का उपयोग कर सकते हैं। वर्ग अंतरणDataTable सेरजेबल ऑब्जेक्ट है। यह ऑब्जेक्ट क्लाइंट और सर्वर के बीच भेजेगा। Method LoadData (सर्वर पर) DataTable के साथ ऑब्जेक्ट ट्रांसफरटैटेबल भरें। मान DBNull.Value को web.api के माध्यम से स्थानांतरित नहीं किया जा सकता है, फिर मैंने इस मान को नल के साथ बदल दिया)। क्लाइंट null वैल्यू पर deserilaziton के बाद DBNull.Value को बदल दिया जाएगा। मेथड GetDataTable क्लाइंट पर टिकी हुई डेटाटेबल को बाकी एपीआई द्वारा भेजा गया। अगर एरर आता है, तो क्लाइंट मैसेज दिखाएगा।
हेटन 7

Pl अपने उत्तर को संपादित करें और वहां स्पष्टीकरण स्वयं जोड़ें
साहिल मित्तल

0

इस विधि के लिए योग्‍य पास करें यह जेंस स्ट्रिंग को लौटाएगा।

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 क्वेरी: "DESCRIBE टेबलनाम;" 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तालिका में पढ़ने से पहले प्रतिक्रिया में परिभाषाओं का वर्णन करें ।
  • DataTableJson द्वारा परिभाषित स्कीमा की उपेक्षा और विलय करना ।

यह बहुत कुछ लगता है, लेकिन कोड की इसकी केवल तीन अतिरिक्त लाइनें।

// 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)हम अपने आप resp.ObjSchemaको परिभाषित करने के लिए LINQ का उपयोग कर सकते हैं । हम MissingSchemaAction.IgnoreJson द्वारा प्रदान किए गए स्कीमा को अनदेखा करने के लिए उपयोग करेंगे ।

// 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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.