[英]convert json String to datatable?
在转换json字符串数据表时,值字段中的(,)值存在问题。
实际上我的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"
请查看地址方案"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;
}
代码必须在值字段中省略..我该怎么办
您可以使用Newtonsoft
将JSON值转换为C#对象。 这对您来说很容易。 转换为以下对象后,您可以轻松修改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#对象。
如果在读取时不知道您的密钥,则可以使用JSON.Net中的JObject和JProperty类来检索密钥及其值,如下所示:
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转换器(serializer / deserializer ) -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; }
}
然后,可以使用JsonConvert.DeserializeObject方法将当前JSON转换为Data
类型的对象:
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(",", " "));
输出再次相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.