2014-08-31 47 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