使用json.Net序列化ExpandoObject

时间:2016-12-01 15:39:47

标签: c# json.net

我有以下代码,其中page.FieldsExpandoObject。我正在迭代一些用户定义的属性并将它们添加到Expando,转换为IDictionary<string,string>以允许我动态添加新的字段名称/值,但是当我将Fields属性设置为props的值,之后序列化仅为名称提供空值{}。为什么呢?

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);

更新 Nancy罢工的诅咒,Request.Form值被证明是动态的,所以我必须.ToString()才能使其符合预期的{{1} }}

2 个答案:

答案 0 :(得分: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添加数据并将道具传递给序列化。

编辑:

您将值存储在&#34; Page.Fields&#34;中,这也必须是动态的。

答案 1 :(得分:0)

我怀疑这是一个缺陷,而你没有得到Request.Form.Keys符合Field.条件的任何内容。

如果我的pagedynamic Fields属性

,那么您的代码可以正常使用