最初我将JSON字符串反序列化为dymanic类型的List,这很好,直到将它移动到服务器,此时动态列表停止工作。我能找到的唯一答案是这不是列表的异常行为。 The original question
因此,我将动态列表更改为ExpandoObject
dynamic root = JsonConvert.DeserializeObject<ExpandoObject>(jsonstring, new ExpandoObjectConverter());
最初在我的动态列表中,我打电话给
root.record.form_values.Remove("f161");
root.record.form_values.Remove("41df");
root.record.form_values.Remove("a228");
root.record.Remove("changeset_id");
按预期工作,从List中删除这些对象,我最终将其转回JSON并将其发送回API。
在对ExpandoObjects进行一些阅读之后,我发现要删除你需要把它扔到IDictionary中才能拥有.Remove功能。
所以我这样做了:
dynamic dict = (IDictionary<string, object>)root;
然后用以下代码替换我的代码:
dict.record.form_values.Remove("f161");
dict.record.form_values.Remove("41df");
dict.record.form_values.Remove("a228");
dict.record.Remove("changeset_id");
导致错误
&#39; System.Dynamic.ExpandoObject&#39;不包含的定义 &#39;删除&#39;
所以经过多一点阅读后我尝试了以下内容:
dict = (IDictionary<string, object>)root.record.form_values.Remove("f161");
dict = (IDictionary<string, object>)root.record.form_values.Remove("41df");
dict = (IDictionary<string, object>)root.record.form_values.Remove("a228");
dict = (IDictionary<string, object>)root.record.Remove("changeset_id");
导致同样的错误......
如果有人能给我一个从现在开始去哪里的线索,那就太好了。
FYI JSON结构如下:
"{
\"record\":{
\"status\":\"somevalue\",
\"form_values\":
{
\"833b\":\"somevalue\",
\"683b\":\"somevalue\",
\"c9ca\":{\"other_values\":[],\"choice_values\":[\"somevalue\"]}
},
\"latitude\":somevalue,
\"longitude\":somevalue
}
}"
带有DynamicList(工作原理)的原始代码如下:
string jsonstring = data;
var root = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(jsonstring);
root.record.assigned_to = assignedto;
root.record.assigned_to_id = assignedtoid;
root.record.status = status.ToString();
root.record.bb42 = abudgetunit;
root.record.f694 = abudgetunitstr;
root.record.form_values.Remove("f161");
root.record.form_values.Remove("41df");
root.record.form_values.Remove("a228");
root.record.Remove("changeset_id");
答案 0 :(得分:0)
你非常接近。结构中有嵌套的expando对象,并且您只转换了第一个对象。如果您找到嵌套对象并一直转换为form_values,那么它将起作用。
dynamic root = JsonConvert.DeserializeObject<ExpandoObject>(jsonstring, new ExpandoObjectConverter());
var rootDict =(IDictionary<string, object>) root;
var recordDict = (IDictionary<string, object>) rootDict["record"];
var formValuesDict = (IDictionary<string, object>) recordDict ["form_values"];
formValuesDict.Remove("683b");