ExpandoObject动态删除多个值

时间:2016-05-20 00:02:05

标签: c# json ssis

最初我将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");

1 个答案:

答案 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");