之前有整理过一个方法,把JSON串转为对象:
引用:System.Runtime.Serialization.dll
/// <summary>
/// JSON字符串 转换成对象
/// </summary>
/// <typeparam name="T">要转成的 对象类型</typeparam>
/// <param name="sJsonString">要转化的 JSON字符串</param>
/// <returns>返回 转换后的对象</returns>
public static T JSON2DX<T>(string sJsonString)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(sJsonString)))
{
return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
}
}
这个方法的不好的地方是:要先创建一个对象。而我只是要临时导入一些数据时,根本就不想再创建一个对象。因此我再寻找有没有不要通过对象中转,直接插入到数据库中的。
找到Newtonsoft.Json.dll 中的方法可以实现,整理后的代码如下:
引用:Newtonsoft.Json.dll
/// <summary>
/// JSON字符串 转换成SQL语句
/// </summary>
/// <param name="sJsonString">要转化的 JSON字符串
/// <para>格式:"[{\"F1\":\"A1\", \"F2\":\"A2\"}, {\"F1\":\"B1\", \"F2\":\"B2\"}]"</para></param>
/// <param name="sTable">需要插入的 表名</param>
/// <param name="oLabInfo">如果需要显示进度,则设置显示进度的 标签控件</param>
/// <returns>返回 插入成功的数量 / 总处理的数量</returns>
public static string JSON2DB(string sJsonString, string sTable, System.Windows.Forms.Label oLabInfo)
{
string sRet = string.Empty;
JArray oJA = (JArray)JsonConvert.DeserializeObject(sJsonString);
// 字段串
string sZDC = string.Empty;
// 字段列表
List<string> aZD = new List<string>();
foreach (JProperty oJP in oJA[0])
{
sZDC += oJP.Name + ", ";
aZD.Add(oJP.Name);
}
sZDC = sZDC.TrimEnd(", ".ToCharArray());
// 记录数
int lJRS = 0;
// 成功数
int lCGS = 0;
foreach (JToken oJT in oJA)
{
string sSQL = "insert into " + sTable + "(" + sZDC + ") \r\n" +
"values(";
foreach (string sZD in aZD)
{
sSQL += "'" + oJT[sZD].ToString().Trim('"').Replace("'", "#") + "', ";
}
sSQL = sSQL.TrimEnd(", ".ToCharArray()) + ")";
int lRet = MLConn.ExecNoDR(sSQL);
lCGS += lRet;
lJRS++;
if (oLabInfo != null)
{
oLabInfo.Text = lJRS.ToString();
System.Windows.Forms.Application.DoEvents();
}
}
sRet = lCGS.ToString() + "/" + lJRS.ToString();
return sRet;
}
这里直接构建SQL语句。如果安全要求高的,就要绕道了。