2014-08-31 78 views
0

我正在接收不同架构的json文件,并且必须将它们转储到sql数据库中。解析不同架构的json文件到不同的表json.net

的JSON文件的架构

{'type':'abc','data':{'column1':'x','column2':'y',.........}} 

对应每一个类型的模式我有一个名为类似的类型,但与单词“表”附强类型类..

如。 '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 /否则if/else语句...

我想知道是否有其他更好的解决我想要做的..

任何帮助表示衷心感谢的方式..

由于

+0

请看看我的编辑,我已经提出代码避免很多如果。 – 2014-08-31 13:58:19

回答

3

由于通常,JObject是你的朋友:

var parsed = JObject.Parse(json); 
var type = parsed.Value<string>("type"); 

if (type == "abc") 
{ 
    var abcObject = parsed["data"].ToObject<abcTable>(); 
} 

我为了避免许多如果,您可以使用follwing模式:

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()); 
+0

我认为这将是handlers.FirstOrDefault,还如何添加在VAR处理另一个handler'XyzTableHandler”,TX – Arnab 2014-08-31 15:16:52

+0

我发现使用新的[] .. VAR StaffMembers =新[] { 新 员工只是一个例子, (20204, “哈利字段”,EmploymentStatus.FullTime,16.85), 新员工(92857, “詹妮弗杏仁”, \t \t \t EmploymentStatus.FullTime,22.25), 新员工(42963, “沙龙Culbritt”, \t \t \t EmploymentStatus.PartTime,10.95) }; 请确定如何添加多个处理程序--Tx – Arnab 2014-08-31 16:02:18

+0

@Arnab请参阅我的编辑。 – 2014-08-31 17:53:52