2010-02-22 10 views
14

में डेटाटेबल से मैं सी # और .NET पर बहुत नया हूं, लेकिन मैंने इस कोड को संग्रहीत प्रक्रिया को कॉल करने के लिए बनाया है, और फिर मैं लौटा डेटाटेबल लेना चाहता हूं और इसे JSON में परिवर्तित करना चाहता हूं।सी # .NET से JSON

SqlConnection con = new SqlConnection("connection string here"); 
    SqlDataAdapter da = new SqlDataAdapter(); 
    SqlCommand cmd = new SqlCommand("getDates", con); 
    SqlParameter par = new SqlParameter("@PlaceID", SqlDbType.Int); 
    par.Value = 42; 
    da.SelectCommand = cmd; 
    cmd.Parameters.Add(par); 
    DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 

    con.Open(); 

    try{ 
     cmd.CommandType = CommandType.StoredProcedure; 
     da.Fill(ds); 
    } 

मेरा प्रश्न यह है कि ऐसा करने का सबसे अच्छा/सरल तरीका क्या है? एक उदाहरण बहुत अच्छा होगा क्योंकि मैं अभी भी इसके लिए बहुत नया हूं।

+1

संभव डुप्लिकेट [कैसे सी # में json को datatable कन्वर्ट करने के लिए] (http : //stackoverflow.com/questions/17398019/how-to-convert-datatable-to-json-in-c-sharp) – JNF

उत्तर

7

एक डाटाटेबल के बजाय आपको एक डेटरेडर का उपयोग करना चाहिए। आपका कोड अक्षम और कुछ हद तक पढ़ने के लिए मुश्किल है - आप कुछ इस तरह कर सकते हैं:

StringBuilder json = new StringBuilder(); 

using(SqlConnection cnn = new SqlConnection(your_connection_string)) 
{ 
    cnn.open(); 

    using(SqlCommand cmd = new SqlCommand("name_of_stored_procedure", cnn)) 
    { 
     cmd.Paramters.AddWithValue("@Param", "value"); 

     using(SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      while(reader.Read()) 
      { 
       json.AppendFormat("{{\"name\": \"{0}\"}}", reader["name"]); 
      } 
     } 
    } 

    cnn.close(); 
} 

आप तो json.ToString उपयोग कर सकते हैं outpt

+0

धन्यवाद, और कॉम के लिए धन्यवाद मेरे कोड पर एनटी। मैं इसे साफ करने की कोशिश करूंगा। मैं इसका प्रयास करूंगा और देख सकता हूं कि मैं इसके बारे में क्या कर सकता हूं:] – cc0

+0

और स्कैप वर्ण? और सरणी? यह वास्तविक जेसन नहीं है: -/ –

7

धन्यवाद एरियल मिलता है। आपका जवाब बहुत उपयोगी था। यहां एक संस्करण है जो आपके उत्तर पर बनाता है।

public string ReadToJson(SqlDataReader reader) 
{ 
    List<string> cols = new List<string>(10); 
    int ncols = reader.FieldCount; 
    for (int i = 0; i < ncols; ++i) 
    { 
    cols.Add(reader.GetName(i)); 
    } 
    StringBuilder sbJson = new StringBuilder("["); 
    //process each row 
    while (reader.Read()) 
    { 
    sbJson.Append("{"); 
    foreach (string col in cols) 
    { 
     sbJson.AppendFormat("\"{0}\":{1}, ", col, reader[col]); 
    } 
    sbJson.Replace(", ", "},", sbJson.Length - 2, 2); 
    } 
    sbJson.Replace("},", "}]", sbJson.Length - 2, 2); 
    return sbJson.ToString(); 
} 
+0

+1 बहुत उपयोगी !! – OammieR

+0

और स्कैप वर्ण ??? "\ \ n आदि –

+0

@ user1243068 यह उत्तर बहुत पुराना है। आज मैं शायद डेटा रीडर की सामग्री को सूची में धक्का दूंगा और सूची को JSON सरणी में बदलने के लिए JSON.NET (उर्फ न्यूटॉन्सॉफ्ट) का उपयोग करूंगा। – Ariel

23

हालांकि JavaScriptSerializer (System.Web.Script.Serialization.JavaScriptSerializer) सीधे JSON में एक DataTable परिवर्तित नहीं कर सकते, यह एक सूची है कि तब श्रृंखलाबद्ध किया जा सकता है में एक DataTable अनपैक करने के लिए संभव है।

निम्नलिखित समारोह (फ़ील्ड नाम या डेटा प्रकारों के बारे पूर्व ज्ञान के बिना) JSON स्ट्रिंग में एक मनमाना DataTable धर्मान्तरित:

public static string 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] = row[col]; 
     } 
     list.Add(dict); 
    } 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    return serializer.Serialize(list); 
} 
13

आप JSON.NET पुस्तकालय इस्तेमाल कर सकते हैं: http://json.codeplex.com/ क्रमानुसार करने/DataTable deserialize ।

string json = JsonConvert.SerializeObject(table); 

जो कुछ इस तरह के धारावाहिक करता है:

[ { "Column1": "Row Value", "Column2": "2" } ] 

आप DataTable उदा बारे में अधिक जानकारी क्रमानुसार करने की जरूरत है कॉलम स्कीमा, प्राथमिक कुंजी, तालिका का नाम तब आप कस्टम कनवर्टर का उपयोग कर सकते थे जो मैंने लिखा था: https://github.com/chris-herring/DataTableConverter। इस तरह यह प्रयोग करें:

string json = JsonConvert.SerializeObject(table, new Serialization.DataTableConverter()); 
DataTable table = JsonConvert.DeserializeObject<DataTable>(json, new Serialization.DataTableConverter()); 

जो कुछ इस तरह के धारावाहिक करता है:

{ 
    "TableName": "TestTable", 
    "Columns": [ 
     { 
      "AllowDBNull": false, 
      "AutoIncrement": true, 
      "AutoIncrementSeed": 2, 
      "AutoIncrementStep": 1, 
      "Caption": "PrimaryKey", 
      "ColumnName": "PrimaryKey", 
      "DataType": "Int32", 
      "DateTimeMode": "UnspecifiedLocal", 
      "DefaultValue": null, 
      "MaxLength": -1, 
      "Ordinal": 0, 
      "ReadOnly": false, 
      "Unique": true 
     } 
    ], 
    "Rows": [ 
     [ 
      1 
     ], 
     [ 
      2 
     ], 
     [ 
      3 
     ] 
    ], 
    "PrimaryKey": ["PrimaryKey"] 
} 
+1

वाह Awesum :) +1 के लिए +1 .. –

3

धन्यवाद कार्ल वेन्ज़ेल। मुझे एक समस्या थी जहां मैं केवल पुराने एएसएमएक्स webservice से डेटा तालिका प्राप्त कर सकता था। अब मैंने एक वेब पेज लिखा है जो इस डेटाटेबल को पार्स कर सकता है और इसे JSON में वापस कर सकता है।

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

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

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

जावास्क्रिप्ट serializer का उपयोग किए बिना एक वैकल्पिक तरीका: मैं JavaScriptSerializer + LINQ का उपयोग

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

      } 
//Function 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]", ""); 
      } 
2

return new JavaScriptSerializer().Serialize(
    dataTable.Rows.Cast<DataRow>() 
    .Select(row => row.Table.Columns.Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row[col.ColumnName])) 
    .ToList() 
); 
की