본문 바로가기

C# .Net

Json / Xml to DataSet

Json / Xml 문자열을 DataSet 에 넣는 코드

(5년전 작성한 블로그글에서 발췌한것으로 코드가 지저분하고 Json 이나 Xml 문자열에 따라 오류발생 가능)

 

JObject인경우와 JArray 인 경우는 재귀되도록 구현

 

(하나의 테이블에 담아야 하는 기능이 필요하여 개발한것으로 여러 JObject 나 JArray 에서 명칭이 같은 것이 있으면 오류)

-> 수정

eachTable 이 true 이면 각 Object 별로 테이블 생성

false 이면 기존과 동일하게 하나의 테이블에 삽입

(맨 윗단의 Object 까지만 각각 테이블 생성하도록 한것으로 내부에 있는 Object 중복은 오류)

 

JsonToDataSet.zip
0.23MB

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Xml.Linq;
using System.IO;


namespace JsonToDataSet
{
    public partial class Form1 : Form
    {
        private bool m_eachTable = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            this.PrintRows(JsonToDataSet(textBox1.Text, m_eachTable));
        }
        private void button2_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
            XElement xEle = XElement.Parse(textBox1.Text);
            DataSet ds = new DataSet();
            ds.ReadXml(new StringReader(new XElement("a", xEle).ToString()));
            this.PrintRows(ds);
        }

        private void PrintRows(DataSet dataSet)
        {
            foreach (DataTable table in dataSet.Tables)
            {
                textBox2.Text += table.TableName + "\r\n";
                foreach (DataRow row in table.Rows)
                {
                    foreach (DataColumn column in table.Columns)
                    {
                        textBox2.Text += column.ColumnName + " : " + row[column].ToString() + "\r\n";
                    }
                    textBox2.Text += "\r\n";
                }
                textBox2.Text += "\r\n";
            }

        }
        public DataSet JsonToDataSet(string jsonString)
        {
            return JsonToDataSet(jsonString, false);
        }

        public DataSet JsonToDataSet(string jsonString, bool eachTable)
        {
            DataSet ds = new DataSet("ROOT");
            DataTable dt = new DataTable();
            JArray trgArray = null;
            jsonString = "{\"row\":" + jsonString + "}";
            var jsonLinq = JObject.Parse(jsonString);

            if (jsonLinq.Descendants().First() != null)
            {
                try
                {
                    JToken srcArrayStatus = jsonLinq.Descendants().First();
                    trgArray = new JArray();
                    foreach (JObject row in srcArrayStatus.Children<JObject>())
                    {
                        var cleanRow = new JObject();

                        foreach (JProperty column in row.Properties())
                        {
                            JsonConvert.SerializeObject(ds, Formatting.Indented);
                            cleanRow = JTokenIntoDataSet(column, cleanRow);
                            if (eachTable && cleanRow.Count != 0) //각 Obejct 별로 Table 생성
                            {
                                trgArray.Add(cleanRow);
                                DataTable dt2 = new DataTable();
                                dt2 = JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());
                                dt2.TableName = column.Name;
                                ds.Tables.Add(dt2);
                                cleanRow.RemoveAll();
                                trgArray.RemoveAll();
                            }
                        }
                        trgArray.Add(cleanRow);
                    }
                    if (!eachTable && trgArray.Count != 0)
                    {
                        dt = JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());
                        dt.TableName = "DataBlock1";
                        ds.Tables.Add(dt);
                    }
                }
                catch (Exception ex)
                { }
            }
            return ds;
        }
        public JObject JTokenIntoDataSet(JToken jToken, JObject cleanRow)
        {  
            if ((jToken as JProperty).Value != null) // "name" : "value"
            {
                if ((jToken as JProperty).Value is JValue)
                {
                    cleanRow.Add((jToken as JProperty).Name, (jToken as JProperty).Value);
                }
                else if ((jToken as JProperty).Value is JObject) // "name" : { "name" : "value", ... }
                {
                    foreach (JToken row in (jToken as JProperty).Value.Children<JToken>())
                    {
                        cleanRow = JTokenIntoDataSet(row, cleanRow);
                    }
                }
                else if ((jToken as JProperty).Value is JArray)
                {
                  
                    JToken srcArrayData = ((jToken as JProperty).Value as JArray).Descendants().First();
                    while (srcArrayData.Next == null)
                    {
                        foreach (JToken row in srcArrayData.Children<JToken>())
                        {
                            JToken jtk = row;
                            cleanRow = JTokenIntoDataSet(jtk, cleanRow);
                        }
                        srcArrayData = srcArrayData.Next;
                    }
                }
            }
            return cleanRow;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if(m_eachTable)
            {
                m_eachTable = false;
            }
            else
            {
                m_eachTable = true;
            }
           
        }
    }
}