如何清空C#中的JObject数组



我有以下json

{       
"audit_date": "2020-05-13T11:27:10.3187798Z",
"client_uuid": "2fd77dd8-ed76-4bba-b0e1-5cda454c8d6e",
"audit_entry": {
"where_uri": "test.com/dataservice/apps/171f0841-825b-4964-8f8c-0869650f14a6",
"why_uri": "test.com/dataservice/reference/reasons_for_change/61acc173-7168-4ae5-9f04- afa228941f8b",
"who_uri": "test.com/securityservice/users/4977dae1-a307-425f-980c-53413fef1b0f",
"when_audited": "2018-11-13T20:20:39+00:00",
"what_uri": "test.com/dataservice/study_subjects/1bc67a71-8549-4ab8-9dd9-e44238198860",
"what_changed": [
{
"attribute_name": "birth_year",
"attribute_value": "1969",
"attribute_change": null
},
{
"attribute_name": "subject_reference",
"attribute_value": "TEST-WOO3444",
"attribute_change": null
}
]
}
}

但是我想清空嵌套数组";什么改变了">

所以我需要输出

{       
"audit_date": "2020-05-13T11:27:10.3187798Z",
"client_uuid": "2fd77dd8-ed76-4bba-b0e1-5cda454c8d6e",
"audit_entry": {
"where_uri": "test.com/dataservice/apps/171f0841-825b-4964-8f8c-0869650f14a6",
"why_uri": "test.com/dataservice/reference/reasons_for_change/61acc173-7168-4ae5-9f04-afa228941f8b",
"who_uri": "test.com/securityservice/users/4977dae1-a307-425f-980c-53413fef1b0f",
"when_audited": "2018-11-13T20:20:39+00:00",
"what_uri": "test.com/dataservice/study_subjects/1bc67a71-8549-4ab8-9dd9-e44238198860",
"what_changed": []
}
}

我已经写了以下代码

JObject jObj = JObject.Parse(jsonText);
jObj["audit_entry"]["what_changed"] = null;
string json = jObj.ToString(Formatting.None);

但是这使得字段为null而不是空数组。

我也试过

JObject jObj = JObject.Parse(jsonText);
jObj["audit_entry"]["what_changed"] = "";
string json = jObj.ToString(Formatting.None);

但这仍然没有给出一个空数组。

我也试过使用数组。方法,但这是一个JObject数组,而不是一个普通数组。

数组由JArray类型表示,而不是JObject。将"what_changed"的值强制转换为正确的类型,然后使用所需的方法。例如:

JObject jObj = JObject.Parse(jsonText);
JArray changed=(JArray)(jObj["audit_entry"]["what_changed"]);
changed.Clear();

不过,使用JSON元素是很不寻常的。通常,将JSON字符串反序列化为强类型对象,根据需要对其进行修改,然后将其序列化回字符串会容易得多。

在Visual Studio中,通过从Edit菜单中选择Paste Special > Paste JSON as Classes,可以很容易地生成必要的DTO

我可以看到几种可能性。。。1.-不是清除数组,而是创建一个新数组,一个空数组。这并不能解决问题,但这是一个变通办法。2.-使用newtonsoft(一个可以下载的nuget包(,你可能可以在那里找到不同的实用程序。2.1.-不使用JObject进行解析,而是使用JArray进行解析,然后使用Clear:https://www.newtonsoft.com/json/help/html/ParseJsonArray.htmhttps://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JArray_Clear.htm.2.2.-使用Remove,为此您需要属性名称,因此您需要在数组(foreach(中迭代,获取属性名称,然后逐个删除。https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_Remove.htm

您需要先将其强制转换为JArray,然后才能使用它的Clear((方法;

((JArray)(jObj["audit_entry"]["what_changed"])).Clear();

或者,您可以简单地创建一个新的JArray来代替旧的。

jObj["audit_entry"]["what_changed"] = new JArray();

试试这个:

JObject jObj = JObject.Parse(jsonText);
JToken jToken = jObj["audit_entry"]["what_changed"];
jToken.Replace(JToken.Parse("[]"));
string json = jObj.ToString(Formatting.None);