将不同模式的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语句。。。

我想知道是否有其他更好的方法来解决我想做的事情。

如有任何帮助,我们将不胜感激。。

感谢

将不同模式的json文件解析为不同的表json.net

通常,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());