2016-03-24 25 views
2

數據映射我得到的Web API這種類型的JSON數據:動態JSON場模式中使用C#

Data: { 
    FromDate: "2016-03-01", 
    Comment: "Bla bla", 
    ... 
}, 
FieldInfo: { 
    Items: [ 
    { 
    Id: "FromDate", 
    Required: true, 
    DataType: "date" 
    }, 
    { 
    Id: "Comment", 
    Required: true, 
    DataType: "string" 
    }, 
    ... 
    ] 
} 

我需要將其序列化到C#對象,並把它轉換爲不同的表達中這應該是這個樣子:

{ 
    FieldInfo: { 
     Items: [ 
     { 
     Id: "FromDate", 
     Required: true, 
     DataType: "date", 
     Value: "2016-03-01" 
     }, 
     { 
     Id: "Comment", 
     Required: true, 
     DataType: "string" 
     Value: "Bla bla" 
     }, 
     ... 
     ] 
    } 

基本上將字段值映射到它的模式,所以它不會被分開。 當然,最簡單的方法就是爲每個領域編寫大量的if,這不會是非常優雅的解決方案,如果我們考慮到字段模式和字段是動態的,所以他們可以改變,甚至是不可行的。我可以依賴的屬性是FieldInfo Item schema中的Id,它應該是Data對象中的屬性名稱。其中一個解決方案可能是使用反射來將Id值映射到C#對象表示中的屬性名稱。我的問題也許有另一種解決方案(或多個)解決這個問題或一些工具可以幫助我實現這個目標?

+0

1)輸入和輸出是否應該是JSON?因爲根據https://jsonformatter.curiousconcept.com/它們是無效的JSON。 2)到目前爲止您嘗試了什麼?如果JSON,你用什麼來解析/反序列化傳入的JSON,然後在轉換後進行序列化? – dbc

+0

是的基本上我有Web API調用另一個Web API,我需要解析它轉換並輸出轉換後的數據版本。我提供的JSON只是爲了更好地理解我想實現的目標。這是無效的,因爲我添加了「...」,以表示您可以擁有不同的字段類型,如果它增加了額外的混淆,抱歉。 –

+0

1)它不只是缺少的引號,最初的JSON缺少外括號。 2)你使用的是什麼框架和序列化程序?如果您正在使用[ASP.NET Web API](http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization),您是否已經使用Json.NET? – dbc

回答

3

使用JSON.NET,您可以解析JSON成JObject並操縱它像這樣:

// Parse your json string into a JObject 
JObject o = JObject.Parse(json); 

// Retrieve the "Data" part of the json, i.e, 
// the object that contains the values 
var data = o["Data"]; 

// Retrieve the "FieldInfo" part. We will add values to this part. 
var fieldInfo = o["FieldInfo"]; 

foreach (var token in fieldInfo["Items"]) 
{ 
    var item = (JObject) token; 

    // Add the Value property to each item, get the value from the 
    // corresponding field 
    item["Value"] = data[(string)item["Id"]]; 
} 

變量f ieldInfo將包含你想要的信息。當然,創建一個新的JObject來包含這些信息會更加清晰。但是該示例顯示瞭如何檢索和映射所需的值。