将不同模式的json文件解析为不同的表json.net
本文关键字:json net 文件 模式 | 更新日期: 2023-09-27 18:20:16
我收到不同模式的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语句。。。
我想知道是否有其他更好的方法来解决我想做的事情。
如有任何帮助,我们将不胜感激。。
感谢
通常,JObject
是您的朋友:
var parsed = JObject.Parse(json);
var type = parsed.Value<string>("type");
if (type == "abc")
{
var abcObject = parsed["data"].ToObject<abcTable>();
}
为了避免许多if,您可以使用以下模式:
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());