2016-12-01 110 views
1

我有以下代碼,其中page.FieldsExpandoObject。我遍歷一些用戶定義的屬性並將它們添加到Expando中,將其轉換爲IDictionary<string,string>以允許我動態添加新的字段名稱/值,但是當我將Fields屬性設置爲props的值時,序列化僅在後面給出名稱的空白值爲{}。爲什麼?使用json.Net序列化ExpandoObject

page.Fields.Foo = "asdf"; 
var test = JsonConvert.SerializeObject(page); // shows Foo=asdf in the json 

// attach all fields to the page object, casting to an IDictionary to be able to add var names 
var props = new ExpandoObject() as IDictionary<string, Object>; 
foreach (string key in Request.Form.Keys) 
{ 
    if (key.StartsWith("Fields.")) 
    { 
     var fieldName = key.Substring(key.IndexOf(".") + 1); 
     props.Add(fieldName, Request.Form[key]); 
    } 
} 

var test2 = JsonConvert.SerializeObject(props); // blank values of {} 
page.Fields = props as ExpandoObject; 

// loses the values for the Fields property 
test = JsonConvert.SerializeObject(page); 

UPDATE南希的詛咒罷工,該Request.Form值竟然是動態的,所以我不得不.ToString()它,使之融入預期IDictionary<string,string>

+1

你想要一個動態的,而不是ExpandoObject,而不是「無功道具」使用「動態道具」 – Gusman

+0

Json.NET可以序列化詞典 - 實際上,Json對象是一個JavaScript字典。也許你應該從你的Form.Keys創建並序列化一個'Dictionaty ',而不是通過一箇中間對象 –

+0

不,它必須是'var props'而不是'dynamic props',因爲它將它轉換爲IDictionary 不是動態的。 – user3791372

回答

1

要正確序列化,你必須將數據聲明該變量爲動態的,而不是作爲ExpandoObject,JSON .net使用反射來檢索屬性,如果它是動態的,則將其轉換爲ExpandoObject並將這些鍵用作屬性名稱,但是如果直接傳遞ExpandoObject,則會嘗試檢索來自ExpandoObject類型的屬性。

只要改變

var props = new ExpandoObject() as IDictionary<string, Object>; 

var props = new ExpandoObject(); 
var iProps = props as IDictionary<string, Object>; 

使用iProps道具添加數據,並通過將序列化。

編輯:

你存儲在「Page.Fields」的價值,這必須是動態也。

+0

爲什麼使用Expando?在這種情況下,只需創建一個Dictionary <> –

+1

因爲問題是關於使用ExpandoObject而不是使用字典。 – Gusman

+1

問題顯示Expando用於從Form.Keys中提取鍵/值數據。 Expando被用作沒有任何動態好處的字典 –

0

我懷疑這是一個缺陷,你沒有得到Request.Form.KeysField.相匹配的標準。

你的代碼工作正常,我如果我有一個pagedynamic Fields財產