Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用json.Net序列化ExpandooObject_C#_Json.net - Fatal编程技术网

C# 使用json.Net序列化ExpandooObject

C# 使用json.Net序列化ExpandooObject,c#,json.net,C#,Json.net,我有以下代码,其中page.Fields是一个ExpandoObject。我正在迭代一些用户定义的属性,并将它们添加到Expando,强制转换为IDictionary,以允许我动态添加新的字段名/值,但是当我将Fields属性设置为props的值时,随后序列化只会给出带有{}/code>空白值的名称。为什么? page.Fields.Foo = "asdf"; var test = JsonConvert.SerializeObject(page); // shows Foo=asdf in t

我有以下代码,其中
page.Fields
是一个
ExpandoObject
。我正在迭代一些用户定义的属性,并将它们添加到Expando,强制转换为
IDictionary
,以允许我动态添加新的字段名/值,但是当我将
Fields
属性设置为
props
的值时,随后序列化只会给出带有
{}/code>空白值的名称。为什么?

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);
page.Fields.Foo=“asdf”;
var test=JsonConvert.SerializeObject(第页);//在json中显示Foo=asdf
//将所有字段附加到页面对象,强制转换到IDictionary以能够添加变量名
var props=作为IDictionary的新ExpandooObject();
foreach(Request.Form.Keys中的字符串键)
{
if(key.StartsWith(“字段”))
{
var fieldName=key.Substring(key.IndexOf(“.”+1);
props.Add(fieldName,Request.Form[key]);
}
}
var test2=JsonConvert.SerializeObject(props);//{}的空白值
page.Fields=作为ExpandooObject的道具;
//丢失Fields属性的值
test=JsonConvert.SerializeObject(第页);

更新Nancy的诅咒来袭,
请求.Form
值结果是动态的,因此我必须
.ToString()
使其适合预期的
IDictionary

要正确序列化数据,必须将变量声明为动态的,而不是ExpandoObject,JSON.net使用反射来检索属性,如果是动态的,则将其强制转换为ExpandoObject并使用键作为属性名,但如果直接传递ExpandoObject,则会尝试从ExpandoObject类型检索属性

换衣服

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

var props=newexpandoobject();
var iProps=作为IDictionary的道具;
使用iProps添加数据并向序列化传递道具

编辑:


您正在将值存储在“Page.Fields”中,这也必须是动态的。

我怀疑这是一个缺陷,您没有从
Request.Form.Keys
中获得任何与
字段匹配的内容。
标准


如果我有一个
页面
类,它具有
动态字段
属性

您想要的是动态的,而不是ExpandoObject,而不是“var props”,那么您的代码对我来说很好用。Json.NET可以序列化字典-事实上,Json对象是一个JavaScript字典。也许您应该从表单中创建并序列化
词汇表
,因为它将其强制转换为IDictionary而不是动态的。您可以将动态转换为IDictionary。@user3791372不应将其强制转换为任何内容。除非使用
dynamic
关键字,否则不能以动态方式使用ExpandoObject为什么要使用Expando?在这种情况下,只需创建一个字典,因为问题询问的是如何使用ExpandoObject,而不是如何使用字典。问题显示Expando用于从Form.Keys中提取键/值数据。Expando被用作没有任何动态好处的字典。这是一个完美的简化示例,假设是危险的。当序列化为json时仍然不起作用,因为值仍然是{}
var props = new ExpandoObject();
var iProps = props as IDictionary<string, Object>;