最近做了一个通用可配置管理系统,系统中界面都是数据库中数据来显示的,本系统和别的系统交互时需要用到ResetFul接口那么问题来了:如何写一个程序不改代码的情况下使接口通用?
想了给解决方法:
1、新建一张接口配置表,字段有:接口地址、端口号、接口传输方式等等,根据配置表调用接口;
过;
2、封装数据库表成传出json;
在接口定义时确定JSON报文格式,用占位符号的方式把数据库表里的数据拼接JSON(需要考虑每次调用接口拼接数据的条件)代码就不贴了;
3、解析传入json,把数据存到数据库中;
把JSON解析成多个DataTable,后面保存到数据库的代码就不贴了;
public static class JsonTextConvert
{
private static Dictionary<string, DataTable> tbname = new Dictionary<string, DataTable>();
/// <summary>
/// 解析json文件
/// </summary>
/// <param name='json'></param>
public async static Task< Dictionary<string, DataTable>> JsConvert(string jsonText)
{
if (jsonText.Length < 1)
{
return null;
}
tbname.Add("root",new DataTable("root"));
JObject dataView = JsonConvert.DeserializeObject<JObject>(jsonText);
JEnumerable<JToken> jTokens = dataView.Children();
List<JEnumerable<JToken>> jTokenss = new List<JEnumerable<JToken>>();
jTokenss.Add(jTokens);
await Task.Run(() => RecursiveAsync(jTokenss));
return tbname;
}
/// <summary>
/// 递归解析json
/// </summary>
/// <param name="jTokens"></param>
/// <returns></returns>
private static List< JEnumerable<JToken>> RecursiveAsync(List<JEnumerable<JToken>> jTokens)
{
if (jTokens.Count == 0)
return null;
List<JEnumerable<JToken>> sss = new List<JEnumerable<JToken>>();
foreach (JEnumerable<JToken> jts in jTokens)
{
foreach (JToken jt in jts)
{
if (jt.Type == JTokenType.Object)
sss.Add(jt.Children());
else if (jt.Type == JTokenType.Property)
{
sss.Add(jt.Children());
if (jt.First().Type == JTokenType.Array || jt.First().Type == JTokenType.Object)
tbname.Add(jt.Path, new DataTable(jt.Path));
}
else if (jt.Type == JTokenType.Array)
{
sss.Add(jt.Children());
string str = jt.Path.Split(".").Last();
if (!tbname.Keys.Contains(jt.Path))
{
if (str.Contains("["))
tbname.Add(jt.Path, new DataTable(str.Substring(0, str.IndexOf("["))));
else
tbname.Add(jt.Path, new DataTable(str));
}
}
else
{
foreach (string s in tbname.Keys)
{
string[] ss = jt.Path.Split(".");
int endIndex = 0;
string trmpString = string.Empty;
if (ss.Count() >= 2)
{
if (jt.Path.Contains("["))
{
endIndex = ss[ss.Length - 2].ToString().IndexOf("[");
trmpString = ss[ss.Length - 2].ToString().Substring(0, endIndex);
}
else
{
endIndex = 0;
trmpString = ss[ss.Length - 2].ToString();
}
}
else
{
endIndex = 0;
trmpString = "root";
}
if (trmpString == s.Split(".").Last())
{
if (!tbname[s].Columns.Contains(ss.Last()))
tbname[s].Columns.Add(ss.Last());
int RowIndex = Convert.ToInt32(trmpString.Replace(s.Split(".").Last(), "").Replace("[", "").Replace("]", "").Length > 0
? trmpString.Replace(s.Split(".").Last(), "").Replace("[", "").Replace("]", "") : "0");
if (tbname[s].Rows.Count < RowIndex + 1)
tbname[s].Rows.Add();
tbname[s].Rows[RowIndex][ss.Last()] = jt;
}
}
}
}
}
return RecursiveAsync(sss);
}
}
匆匆忙忙记录一下,欢迎斧正;