Vikas Hire Ответов: 3

Как читать объект JSON в C#?


привет,
Я не могу прочитать объект JSON, который я получаю в веб-сервисе, и не могу прочитать содержащиеся в нем данные.

Вот мой веб-сервис..

 [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
    public string updateUserInfo(object InputData)
    {

       /*here I want to read object 'InputData'
         and I want to save data in database*/

SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString);

        con.Open();
       //SqlCommand cmd = new SqlCommand("getUserById ", con);
        //cmd.CommandType = CommandType.StoredProcedure;
        //cmd.Parameters.Add("@userId", SqlDbType.VarChar).Value = InputeData;
        //cmd.Parameters.Add("@userId", SqlDbType.VarChar).Value = fName;
        //cmd.Parameters.Add("@userId", SqlDbType.VarChar).Value = lName;
        //cmd.Parameters.Add("@userId", SqlDbType.VarChar).Value = email;
        //cmd.Parameters.Add("@userId", SqlDbType.Date).Value = DOB;


Что я уже пробовал:

Я получаю данные из удаленного места с помощью ajax, Ext JS.
Я хочу получить InputeData boject contains.

Объект InputeData содержит данные JSON, как показано ниже.

{"UserInfo":{"userId":"vikashire","fname":"vikas","lname":"hire","email":"vikashire@yahoo.com","gender":true,"bloodGroup":"A RhD positive (A+)","hieght":""}}

Richard MacCutchan

где находится код, который читает / анализирует JSON?

3 Ответов

Рейтинг:
24

GilbouFR

Обычно я немного жульничаю с ними.
Когда я читаю источник JSON, я хочу внедрить его в базу данных.

Сначала я пытался его правильно расшифровать и так далее.
Был грязным и не оптимизированным.
Поэтому я пошел грубым жестким путем : массовая вставка из потока JSON в таблицу, затем у меня есть хранимая процедура, которая захватывает данные из этой входной таблицы (где все вводится из JSON в виде строки), и процедура выполняет преобразования и тесты с помощью UPDATE/INSERT.

JSON - & gt; массовая вставка в TEMP_BLAH
Вызов (stored_procedure_blah): перемещение из TEMP_BLAH в BLAH
делаем либо вставку, если данных нет, либо обновление уже присутствует.

Это быстро. Он помещает временную таблицу, в которую сбрасываются данные JSON,
таким образом, внутренняя таблица с преобразованными данными хранится в безопасности для содержимого.

Сам код C# прост :
создать

HttpWebRequest
объект
Вы вводите в него URL-адрес JSON следующим образом :

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);


Url Здесь содержит строку с URL-адресом JSON. Затем :

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            try
            {
                WebResponse response = request.GetResponse();
                using (Stream responseStream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                    json = reader.ReadToEnd();
                    reader.Close();
                }
            }
            catch (WebException ex)
            {
                WebResponse errorResponse = ex.Response;
                using (Stream responseStream = errorResponse.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                    Console.WriteLine(reader.ReadToEnd());
                    return some_errror_value;
                }
            }


(это код, написанный вручную и не проверенный, но вы получаете представление о том, как это сделать)

json - это строка. Теперь он содержит данные JSON.

Затем я использовать класс XmlDocument, чтобы десериализовать JSON-файла :

System.Xml.XmlDocument xml = JsonConvert.DeserializeXmlNode(json, TableName);


TableName-это переменная, содержащая имя таблицы, в которую я хочу ввести содержимое.

DataSet dataSet = new DataSet();

dataSet.ReadXml(XmlReader.Create(new StringReader(xml.InnerXml)), XmlReadMode.InferSchema);


Данных из XML в набор данных

Затем я открываю соединение с базой данных SQL и вводю данные, которые у меня есть, в виде массовой вставки :

SqlConnection conn = new SqlConnection(ConnectionString);
                conn.Open();


ConnectionString
содержит вашу обычную строку подключения SQL

foreach(DataTable dt in dataSet.Tables)
                {
                    string TableName = "[IMPORT_" + dt.TableName.Replace('{', ' ').Replace('}', ' ') + "]";
                    ExecuteNonQuery(conn, String.Format("DROP TABLE {0}", TableName));
                    SqlBulkCopy bulk = new SqlBulkCopy(conn);
                    bulk.DestinationTableName = TableName;
                    bulk.WriteToServer(dt);
                }


static private bool ExecuteNonQuery(SqlConnection conn, string sql)
        {
            try
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    Debug.WriteLine(sql);
                    cmd.CommandText = sql; cmd.ExecuteNonQuery();
                }
                Debug.WriteLine("ok");
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return false;
            }
        }


И это делает объемную вставку работы.

Я написал все это так, как помню. Возможно, вам придется немного поработать для полного решения, но это даст вам представление о том, как я это делаю.

Это жестоко, но работает очень хорошо. У меня есть дюжина источников JSON, для каждого я хватаю JSON и впрыскиваю в таблицу IMPORT_blabla, используя BULK INSERT и отбрасывая существующую таблицу. Вы можете сделать усечение вместо падения, если хотите.

Затем у вас есть ваши данные в таблицах IMPORT_*, и хранимая процедура будет выполнять работу вставки/обновления по мере необходимости.


Vikas Hire

Спасибо..

Рейтинг:
0

Vikas Hire

Спасибо, Гильбуфр..

На самом деле я нашел решение своей проблемы.

Я получаю импорт в своем коде.

using Newtonsoft.Json;
И получите объект десериализации, используя приведенный ниже код.

var jsonResult = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(InputData);


И я получил то, что хотел..

string userId =jsonResult["userId"];
       string fname = jsonResult["fname"];
       string lname = jsonResult["lname"];
       string email = jsonResult["email"];
       string DOB = jsonResult["DOB"];
       bool gender = jsonResult["gender"];
       string bloodGroup = jsonResult["bloodGroup"];
       string hieght = jsonResult["hieght"];

       SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString);

       con.Open();
       SqlCommand cmd = new SqlCommand("UpdateUserInfo ", con);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.Parameters.Add("@userId", SqlDbType.VarChar).Value = userId;
       cmd.Parameters.Add("@firstName", SqlDbType.VarChar).Value = fname;


Рейтинг:
0

GilbouFR

Ага. В моем случае у меня было около дюжины источников JSON, без каких-либо объяснений содержания, кроме "МММ, возьмите из столбца X и Y этот JSON, и Вам также понадобится Z из этого другого".

Если у вас есть схема JSON это становится намного проще :-)


Vikas Hire

ладно.