我正在接收不同架构的json文件,必须将它们转储到sql数据库中。
json文件具有架构
{'type':'abc','data':{'column1':'x','column2':'y',.........}}
对应于每种类型的模式,我有一个强类型类,类似于类型但附加了单词'Table'..
例如。 'abcTable',它只有json.data(column1,column2,...)
的模式所以,我能做的是对主json进行动态反序列化,然后根据类型值做一个强类型的json解析相应的数据
dynamic jsondata = JsonConvert.DeserializeObject<dynamic>(json);
if (jsonata.type=='abc')
{
var abcobj = JsonConvert.DeserializeObject<abcTable>(jsondata.data);
}
这里我将对象反序列化两次,所以看起来不是正确的做法..
此外,我还有25个以上的模式和类似数量的类/表
所以,我将使用很多if / else if / else语句......
我想了解是否有其他更好的方法来解决我正在尝试做的事情。
真心感谢任何帮助。
由于
答案 0 :(得分:3)
通常情况下,JObject
是您的朋友:
var parsed = JObject.Parse(json);
var type = parsed.Value<string>("type");
if (type == "abc")
{
var abcObject = parsed["data"].ToObject<abcTable>();
}
我为了避免许多ifs,你可以使用以下模式:
public interface ITableType
{
bool Match(string type);
void Handle(JToken jsonTable);
}
public AbcTableHandler: ITableType
{
public bool Match(string type)
{
return type == "abc";
}
public void Handle(JToken jsonTable)
{
var abcTable = jsonTable.ToObject<abcTable>();
// other code
}
}
用法:
var handlers = new[] { new AbcTableHandler() };
// ...
var parsed = JObject.Parse(json);
var type = parsed.Value<string>("type");
var handler = handlers.SingleOfDefault(h => h.Match(type));
if (handler == null)
throw new InvalidOperationException("Cannot find handler for " + type);
handler.Handle(parsed["data"]);
修改强> 添加多个处理程序:
var handlers = new ITableType[] { new AbcTableHandler(), new OtherHandler, etc.. };
或
var handlers = new List<ITableType>();
handlers.Add(new AbcTableHandler());
handlers.Add(new OtherHandler());