ডেটেবলকে সি # তে JSON এ রূপান্তর করুন


87
  1. আমি একটিতে ডাটাবেস থেকে রেকর্ড পেতে চাই DataTable
  2. তারপরে এটিকে DataTableJSON অবজেক্টে রূপান্তর করুন ।
  3. আমার জাভাস্ক্রিপ্ট ফাংশনে JSON অবজেক্টটি ফিরিয়ে দিন।

আমি এই কোডটি কল করে ব্যবহার করেছি :

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

ডেটা টেবিলটিকে জেএসএনে রূপান্তর করতে, এটি সঠিকভাবে কাজ করে এবং নিম্নলিখিতটি ফেরত দেয়:

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

কিভাবে আমি এটি করতে পারব?


দরকারী নিবন্ধ: এসপিএন সি # কোডেপিডিয়া.info
সিংহ

উত্তর:


194

এই কোড স্নিপেট রূপান্তর তথ্য থেকে জেএসএন স্ট্রিংয়ে সি # তে, ভিবি.এনইটি আপনাকে সাহায্য করতে পারে। এটি 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);
        }
    }
}

আমার কাছে যদি ২ টি ডেটাটেবল থাকে এবং আমার সেগুলিকে একটি জসন স্ট্রিংয়ে রূপান্তর করতে হবে তবে জসন অ্যারেতে আমার প্রতিটি ডেটেবল দরকার আমি কী করব?
ব্যবহারকারী 7291

@ একজন কীভাবে এই ডেটাটি টেবিলটিতে যুক্ত করবেন
স্মিথ

6
আপনি জাভাস্ক্রিপ্টসিরাইজারের পরিবর্তে জসন.নেট ব্যবহার করতে পারেন: নিউটোনসফট.জসন.জসন কনভার্ট.সিরাইজওবজেক্ট (সারি) ফিরিয়ে দিন;
দিয়েগো

4
আমার জন্য (.NET ফ্রেমওয়ার্ক 4.5), সিস্টেমের "স্ক্রিপ্ট" eWeb.Script স্বীকৃত / সমাধানযোগ্য নয়; তন্ন তন্ন "ধারাবাহিকভাবে" এ হল "seralizer.Serialize (সারি)"
বি ক্লে শ্যানন

73

আমরা দুটি সহজ উপায়ে টাস্কটি সম্পাদন করতে পারি একটি হ'ল Json.NET dll এবং অন্যটি স্ট্রিংবিল্ডার ক্লাস ব্যবহার করে।

নিউটনসফট জসন.এনইটি ব্যবহার করে

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

রেফারেন্স লিংক: নিউটনসফট : ডেটা টেবিলটিকে এএসপি.নেট সি # তে জেএসএন অবজেক্টে রূপান্তর করুন #

স্ট্রিংবিল্ডার ব্যবহার করে

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

4
এই ফাংশনটি ঠিকঠাক কাজ করছে, তবে কীভাবে ডেটাটেবল সারি ক্ষেত্রে ডাবল উদ্ধৃতি হ্যান্ডেল করা যায়।
প্রণয় সনি

কোনও কারণে জিসনস্ট্রিং অ্যাপ্রোচ সিরিয়ালাইজঅবজেক্টের চেয়ে দ্বিগুণ দ্রুত ... বড় ডেটাসেটে পারফরম্যান্সও খুব ভাল নয়।
হাইজিকেলিস্ট

এই কোডটি ভাল, তবে অন্য ভেরিয়েবল তৈরির পরিবর্তে সরাসরি ডাটা টেবিল প্যারামিটার থেকে সরাসরি ডেটা পড়তে আরও দ্রুত হবে
আয়ানিক্স

এটি একটি দুর্দান্ত সমাধান নয়। প্রারম্ভিকদের জন্য, যদি আপনার ডাটাবেসের কোনও মান রয়েছে যা এর সাথে উদ্ধৃতি অক্ষর রয়েছে - এটি ব্যর্থ হবে। আপনি নিউটনসফট প্যাকেজ থেকে জসনসেক্সট রাইটার ব্যবহার করা ভাল
স্টাটিক টাইপ

নিউটনসফট জসন. নেট ব্যবহার করে সম্ভবত সবচেয়ে সহজ এবং সর্বোত্তম সমাধান আইএমও
ব্যবহারকারীর 32325050

28

স্বীকৃত উত্তরের সাথে এটির অনুরূপ পন্থা রয়েছে তবে কোডের একক লাইনে ডেটাবেটকে তালিকাতে রূপান্তর করতে লিনকিউ ব্যবহার করে।

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

এটি মূল প্রশ্নের বিষয়বস্তু নয় তবে সম্পূর্ণতার জন্য, আমি উল্লেখ করব যে আপনি যদি কোনও বিদ্যমান ডেটেবল থেকে সারিগুলি ফিল্টার করতে চান তবে এই উত্তরটি দেখুন


ধরে নিচ্ছি যে আমি এই কোডটি ব্যবহার করেছি, জেসন ডেটা দেখানোর জন্য আমি ভিউটিতে কী রাখব?
জ্যামি

4
এটি একটি খুব মুক্ত প্রশ্ন। আপনি ভিউতে প্রেরিত ডেটা পার্স করার জন্য বেশ কয়েকটি জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক এবং সরঞ্জাম ব্যবহার করতে পারেন। উদাহরণস্বরূপ জেকিউগ্রিড। অথবা আপনি জাভা স্ক্রিপ্টটি লুপের জন্য ব্যবহার করে তালিকাকে পার্স করতে এবং এইচটিএমএল দিয়ে ম্যানুয়ালি একটি টেবিল তৈরি করতে পারেন। আমার শেষ উদাহরণে পুরুষসভার 21, আমি ফলাফলটিকে একটি স্ট্রিংয়ের সাথে সম্মতি দিয়েছি। আপনি সি # তে এইচটিএমএল টেবিল বা তালিকা তৈরি করতে পারেন এবং কেবল সামগ্রীটি ফিরে আসতে পারেন।
বিজয় জগডালে

ঠিক আছে ধন্যবাদ. আমি তালিকাটি দেখানোর জন্য 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]", "");
            }

4
আমি জানি কেন আমি নিম্নচাপে আছি? এটি একটি কার্যকরী কোড-স্নিপেট ... এটি উত্পাদন পরিবেশে ব্যবহৃত হচ্ছে।
দুরাই আমুথান.এইচ

4
সম্ভবত আপনি যখন আরও ওও পদ্ধতির ব্যবহার করতে পারেন তখন আপনি ম্যানুয়ালি একটি JSON কাঠামো তৈরি করছেন কারণ সম্ভবত। এইভাবে এটি করা বেশ অগোছালো।
জোশ এম

6
@ জোশম - আমার উত্তরটি মঙ্গুদের ত্বকের আরও একটি উপায় দেখানোর জন্য।
দুরাই আমুথান।এইচ

4
কিছু আমাকে বলেছে যে কোনও প্রোগ্রামারকে তৃতীয় পক্ষের সরঞ্জামগুলি ব্যবহার করার মতো কোড লিখতে সক্ষম হওয়া উচিত এবং কাস্টম কোডটি লেখার পক্ষে এই সাধারণ কোনও জিনিসের জন্য একটি ফোলা সরঞ্জাম ব্যবহার করার চেয়ে ভাল হতে পারে।
অ্যাডাম হিগ

7

আপনি আলিরেজা মাদদা দ্বারা উল্লিখিতভাবে একইভাবে ব্যবহার করতে পারেন এবং আপনি যদি একটি জসন অ্যারেতে দুটি ডেটা টেবিল ব্যবহার করতে চান তবে নীচের উপায়টি:

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

সি #। নেট ব্যবহার করে ডেটেবলকে জেএসএনে রূপান্তর করুন

 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 = নতুন জাভাস্ক্রিপ্টসরিয়ালাইজার () se
হাসান জাওয়াইদ

2

জসন পদ্ধতিতে রূপান্তরযোগ্য ডেটাটেবল মান অ্যাক্সেস করতে নীচের পদক্ষেপগুলি অনুসরণ করুন:

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

এখন আপনার জসনকে ডেটাটেবেলে রূপান্তর করুন:

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

ইঙ্গিত: আইটেম.এড (কল। কলামনাম, ডা।
মিচ গম

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

সিনচু ইটিএল - একটি ওপেন সোর্স লাইব্রেরি দিয়ে আপনি কয়েকটি লাইন কোডের সাহায্যে খুব সহজেই 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);

আপনার যদি জেনেরিক এসকিউএল অনুরোধের জন্য ওয়েব সার্ভিস এপিআই প্রেরণের দরকার হয় তবে আপনি আমার সমাধানটি ব্যবহার করতে পারেন।
হেটা 77

আপনার যদি জেনেরিক এসকিউএল অনুরোধ প্রেরিত ওয়েব সার্ভিস এপিআই প্রেরণের দরকার হয় তবে আপনি আমার সমাধানটি ব্যবহার করতে পারেন। ক্লাস ট্রান্সফারডেটা টেবিল সিরিজিবল অবজেক্ট। এই অবজেক্টটি ক্লায়েন্ট এবং সার্ভারের মধ্যে পাঠিয়ে দেবে। পদ্ধতি লোডডেটা (সার্ভারে) ডাটাবেল সহ অবজেক্ট ট্রান্সফার ডেটা টেবিল পূরণ করে। মান DBNull.Value web.api মাধ্যমে স্থানান্তরিত করা যাবে না, তারপরে আমি এই মানটি নাল দিয়ে প্রতিস্থাপন করেছি)। ক্লায়েন্ট নাল মান উপর deserilaziton পরে DBNull.Value দ্বারা প্রতিস্থাপিত হবে। ক্লায়েন্টের পুনর্নির্মাণের পদ্ধতিটি ডেটা টেবিল বিশ্রাম এপিআই দ্বারা প্রেরিত ডেটা টেবিল। যদি ত্রুটি আসে তবে ক্লায়েন্ট শো বার্তা।
হেটা 77

আপনার উত্তর সম্পাদনা করুন এবং সেখানে নিজেই ব্যাখ্যাটি যুক্ত করুন
সাহিল মিত্তাল

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

মাইএসকিউএল ক্যোয়ারী: "টেবিলের নামটি ডিজাইন করুন;"; ডেটাবেলটোজসন (ডেটা টেবিল) উদাহরণ আউটপুট:

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

পিএইচপি দিয়ে পরীক্ষিত:

$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

এই উত্তরগুলির সবগুলিই ডেটা সরানোর জন্য দুর্দান্ত! যেখানে তারা ব্যর্থ হয় সেখানে স্থানান্তরিত হওয়ার কলামের ধরণের ডেটা সংরক্ষণ করা হয়। যখন আপনি একত্রীকরণ datatables ভালো জিনিস যে কাজ করতে চান এই সমস্যা হয়ে প্রদর্শিত একই যাবে। অনুমান করাJsonConvert যেতে পারে কলামের ডেটাটাইপ নির্ধারণের জন্য ডেটার প্রথম সারিটি দেখবে

এটি কাছাকাছি পেতে;

  • পৃথক প্রতিক্রিয়া অবজেক্টে সংজ্ঞা DataTableএবং DataColumnসংজ্ঞাটি সিরিয়াল করুন ।
  • DataColumnসারণীতে পড়ার আগে প্রতিক্রিয়াতে সংজ্ঞাগুলি ডেসরিয়াল করুন ।
  • DataTableজসন দ্বারা সংজ্ঞায়িত স্কিমার উপেক্ষা এবং মার্জ করুন ।

এটি প্রচুর মত শোনাচ্ছে তবে কোডটির এটি কেবল তিনটি অতিরিক্ত লাইন।

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

জসনকে কলাম সংজ্ঞা সংজ্ঞায়িত করার পরিবর্তে dt = JsonConvert.DeserializeObject<DataTable>(response)আমরা সেগুলি নিজেরাই সংজ্ঞায়িত করতে লিনকিউ ব্যবহার করতে resp.ObjSchemaপারি। আমরা MissingSchemaAction.Ignoreজসন দ্বারা সরবরাহিত স্কিমা উপেক্ষা করার জন্য ব্যবহার করব ।

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