2015-08-22 2 views
0

Преобразование строки json string, связанной с проблемой с (запятой) значением в поле значения.конвертировать json String в datatable?

actualy моя JSON строка [{"BNo":"345","GNo":"3453","FirstName":"fjai","LastName":"ljai","Address":"BARETI,CEVO, 13/2","Telephone":"051682247","BirthDate":"23-Jan-1981","Email":""}]

В том, что, пожалуйста, смотрите по адресу сценария "Address":"BARETI,CEVO, 13/2"

Он имеет в области значений. При преобразовании строки в базу данных я получил ошибку. Вот код, который я использовал новообращенный JSon строку DataTable

public DataTable JsonStringToDataTbl(string jsonString) 
{ 
    DataTable dt = new DataTable(); 
    string[] jsonStringArray = Regex.Split(jsonString.Replace("[", "").Replace("]", ""), "},{"); 
    List<string> ColumnsName = new List<string>(); 
    foreach (string jSA in jsonStringArray) 
    { 
     string[] jsonStringData = Regex.Split(jSA.Replace("{", "").Replace("}", ""), ","); 
     foreach (string ColumnsNameData in jsonStringData) 
     { 
      try 
      { 
       int idx = ColumnsNameData.IndexOf(":"); 
       string ColumnsNameString = ColumnsNameData.Substring(0, idx - 1).Replace("\"", ""); 
       if (!ColumnsName.Contains(ColumnsNameString)) 
       { 
        ColumnsName.Add(ColumnsNameString); 
       } 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(string.Format("Error Parsing Column Name : {0}", ColumnsNameData)); 
      } 
     } 
     break; 
    } 
    foreach (string AddColumnName in ColumnsName) 
    { 
     dt.Columns.Add(AddColumnName); 
    } 
    foreach (string jSA in jsonStringArray) 
    { 
     string[] RowData = Regex.Split(jSA.Replace("{", "").Replace("}", ""), ","); 
     DataRow nr = dt.NewRow(); 
     foreach (string rowData in RowData) 
     { 
      try 
      { 
       int idx = rowData.IndexOf(":"); 
       string RowColumns = rowData.Substring(0, idx - 1).Replace("\"", ""); 
       string RowDataString = rowData.Substring(idx + 1).Replace("\"", ""); 
       nr[RowColumns] = RowDataString; 
      } 
      catch (Exception ex) 
      { 
       continue; 
      } 
     } 
     dt.Rows.Add(nr); 
    } 
    return dt; 
} 

Код должен опустить в поле значения .. что я могу сделать

+2

Почему бы не преобразовать json в объекты, а затем отредактировать свойство в объекте и после этого преобразовать его в datarow? – Tinwor

+0

Если вы не можете сказать, как я могу это сделать .. На самом деле веб-служба wcf возвращает строку json в качестве вывода ... теперь я хочу изменить как таблицу – jai

+0

, если бы я был вами, я бы посмотрел на http: //www.newtonsoft.com/json, это сэкономит вам много времени. Это упрощает преобразование вашего json в объекты и обратно :) –

ответ

0

Если ключи неизвестны на момент читается, то вы можете использовать JObject и JProperty классы от Json.NET, чтобы получить ключи и их значения, как это:

private void printKeysAndValues(string json) 
{ 
    var jobject = (JObject)((JArray)JsonConvert.DeserializeObject(json))[0]; 
    foreach (var jproperty in jobject.Properties()) 
    { 
     Console.WriteLine("{0} - {1}", jproperty.Name, jproperty.Value); 
    } 
} 

Применительно к двум отличается JSON строка ввода, извлекает пару ключ/значение:

var json1 = @"[{""BNo"":""345"",""GNo"":""3453"",""FirstName"":""fjai"",""LastName"":""ljai"",""Address"":""BARETI,CEVO, 13/2"",""Telephone"":""051682247"",""BirthDate"":""23-Jan-1981"",""Email"":""""}]"; 
var json2 = @"[{""Test"": ""A"", ""Text"":""some text"", ""Numbers"":""123""}]"; 
printKeysAndValues(json1); 
Console.WriteLine("-------------------"); 
printKeysAndValues(json2); 

И выход:

BNo - 345 
GNo - 3453 
FirstName - fjai 
LastName - ljai 
Address - BARETI,CEVO, 13/2 
Telephone - 051682247 
BirthDate - 23-Jan-1981 
Email - 
------------------- 
Test - A 
Text - some text 
Numbers - 123 

Один из возможных вариантов заключается в использовании ключевого слова dynamic. Вы можете получить прямой доступ на поле, как это:

var json = @"[{""BNo"":""345"",""GNo"":""3453"",""FirstName"":""fjai"",""LastName"":""ljai"",""Address"":""BARETI,CEVO, 13/2"",""Telephone"":""051682247"",""BirthDate"":""23-Jan-1981"",""Email"":""""}]"; 
dynamic data = JsonConvert.DeserializeObject(json); 
// take the first element of the array 
string address = data[0].Address; 
Console.WriteLine(address.Replace(",", " ")); 

Выход:

BARETI CEVO 13/2 

Обратите внимание, что String.Replace не терпит неудачу, если символ, который должен быть заменен в настоящее время не присутствует, поэтому "test".Replace(",", " "); вернется test.

Другой возможностью является использование в ASP.NET-сборке в конвертере JSON (сериализатор/десериализатор) - NewtonSoft JSON.Net. Вы можете использовать его для восстановления структурированных данных.Вам нужно создать класс, представляющий структуру JSON:

public class Data 
{ 
    public string BNo { get; set; } 
    public string GNo { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
    public string Telephones { get; set; } 
    public string BirthDates { get; set; } 
    public string Emails { get; set; } 
} 

Тогда ток JSON может быть преобразован в объект типа Data с использованием метода JsonConvert.DeserializeObject:

var json = @"[{""BNo"":""345"",""GNo"":""3453"",""FirstName"":""fjai"",""LastName"":""ljai"",""Address"":""BARETI,CEVO, 13/2"",""Telephone"":""051682247"",""BirthDate"":""23-Jan-1981"",""Email"":""""}]"; 
// remove square braces [ and ] at the start resp. end 
var data = JsonConvert.DeserializeObject<Data>(json.Substring(1).Substring(0, json.Length - 2)); 

Теперь вы можете получить доступ к Address поле и, например, заменить , символ:

Console.WriteLine(data.Address.Replace(",", " ")); 

выходной сигнал является:

BARETI CEVO 13/2 

Я думаю, что ваш сервис возвращает также неправильный формат JSON. JSON всегда начинается с объекта (если не в JavaScript), что означает, что все на верхнем уровне должно быть заключено в фигурные скобки { и }. Если служба должна вернуть массив, тогда он должен выглядеть так: {"results": [{"BNo":"...},{...}]}. Если вы не можете изменить услугу, вы можете адаптировать/исправить возвращаемую строку. Добавьте набранную модель для массива:

public class DataHolder 
{ 
    public Data[] data { get; set; } 
} 

, а затем создать правильный объект JSON держит массив:

var data = JsonConvert.DeserializeObject<DataHolder>("{\"data\":" + json + "}"); 
Console.WriteLine(data.data[0].Address.Replace(",", " ")); 

Выход опять же.

+0

Спасибо @pasty, но колонка динамическая. Что я могу сделать – jai

+0

В какой колонке динамический? Вы имеете в виду, что у вас всегда нет имени «Адрес», вместо этого столбцы называются по-разному каждый раз? Если столбец «Адрес» имеет различный контент каждый раз, то «Replace» будет работать, даже если символ '' 'присутствует! – pasty

+0

Если все столбцы являются динамическими, тогда структура 'Key/Value' будет, вероятно, более подходящей. Извлечение * имя * и * значение * будет намного проще. – pasty

0

Вы можете преобразовать значение JSON для объектов C# с использованием Newtonsoft. Это было бы легко для вас. После того, как вы перешли к приведенному ниже объекту, вы можете легко изменить свойство Address, чтобы удалить значение ','.

public class RootObject 
{ 
    public string BNo { get; set; } 
    public string GNo { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
    public string Telephone { get; set; } 
    public string BirthDate { get; set; } 
    public string Email { get; set; } 
} 

Используйте строку ниже, чтобы преобразовать в C# объекта

var jsonString = "The output of your webservice"; 
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(jsonString); 

Теперь obj экземпляр держит C# объект, который очень легко манипулировать.

+0

Столбцы будут розданы в гинаграмме. он будет известен во время выполнения – jai

+0

Что все столбцы динамические? – Karthik

Смежные вопросы