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

时间:2014-08-31 08:09:41

标签: c# json json.net

我正在接收不同架构的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语句......

我想了解是否有其他更好的方法来解决我正在尝试做的事情。

真心感谢任何帮助。

由于

1 个答案:

答案 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());