C# 从JSON字符串中删除空数组成员
我有一个JSON字符串,如下所示。我希望以编程方式从中删除空数组对象,以便将其转换为DataTable 以下是我的JSON示例:C# 从JSON字符串中删除空数组成员,c#,json,json.net,C#,Json,Json.net,我有一个JSON字符串,如下所示。我希望以编程方式从中删除空数组对象,以便将其转换为DataTable 以下是我的JSON示例: { "result":[ { "id":"1", "name": "Temp", "property":[] }, { "id":"2", "name": "Temp2", "property":[] } ] } 可以看到每个结果中的
{
"result":[
{
"id":"1",
"name": "Temp",
"property":[]
},
{
"id":"2",
"name": "Temp2",
"property":[]
}
]
}
可以看到每个结果中的属性成员都是空数组。有没有关于如何删除它的建议
目前,我正在执行以下操作以将JSON转换为DataTable:
foreach (var item in data["result"])
{
JObject obj = (JObject)item;
obj.Property("property").Remove();
}
DataTable dt = JsonConvert.DeserializeObject<DataTable>(data["result"].ToString());
JObject data = JObject.Parse(json);
var emptyArrayProperties = data["result"]
.Children<JObject>()
.SelectMany(jo => jo.Properties())
.Where(jp => jp.Value.Type == JTokenType.Array && !jp.Value.HasValues)
.ToList();
foreach (JProperty prop in emptyArrayProperties)
{
prop.Remove();
}
DataTable table = obj["result"].ToObject<DataTable>();
当我手动删除数组属性时,转换效果非常好。这就是从JSON中删除“property”数组并将剩余数据解析到DataTable中的方法:
foreach (var item in data["result"])
{
JObject obj = (JObject)item;
obj.Property("property").Remove();
}
DataTable dt = JsonConvert.DeserializeObject<DataTable>(data["result"].ToString());
JObject data = JObject.Parse(json);
var emptyArrayProperties = data["result"]
.Children<JObject>()
.SelectMany(jo => jo.Properties())
.Where(jp => jp.Value.Type == JTokenType.Array && !jp.Value.HasValues)
.ToList();
foreach (JProperty prop in emptyArrayProperties)
{
prop.Remove();
}
DataTable table = obj["result"].ToObject<DataTable>();
您可以使用正则表达式从json字符串本身删除带有空数组的属性。这里是一个使用两个正则表达式的正则表达式,一个用来杀死带有空数组的属性,另一个用来杀死剩余的任何错误逗号
var json = "{\"prop\": [], \"prop2\": \"test\", \"propqw\": []}";
var removeEmpty = new Regex("\\s*\"[^\"]+\":\\s*\\[\\]\\,?");
var removeComma = new Regex(",(?=\\s*})");
var result = removeEmpty.Replace(json, "");
result = removeComma.Replace(result, "");
可能还有比这更干净的方法,但我无法快速找到一种正则表达式方法来删除属性和清除潜在的非法逗号。您可以使用Json.Net删除空数组属性,而不管它们的名称如何,然后将结果转换为DataTable:
foreach (var item in data["result"])
{
JObject obj = (JObject)item;
obj.Property("property").Remove();
}
DataTable dt = JsonConvert.DeserializeObject<DataTable>(data["result"].ToString());
JObject data = JObject.Parse(json);
var emptyArrayProperties = data["result"]
.Children<JObject>()
.SelectMany(jo => jo.Properties())
.Where(jp => jp.Value.Type == JTokenType.Array && !jp.Value.HasValues)
.ToList();
foreach (JProperty prop in emptyArrayProperties)
{
prop.Remove();
}
DataTable table = obj["result"].ToObject<DataTable>();
Fiddle:要直接讨论上述问题,我们可以使用IContractResolver解决该问题 其工作原理如下: 在项目模型文件夹中创建一个类,例如MyClass。 添加以下代码
public class MyClass : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = obj =>
{
if (property.PropertyType.Name.Contains("ICollection"))
{
return (property.ValueProvider.GetValue(obj) as dynamic).Count > 0;
}
return true;
};
return property;
}
}
DefaultContractResolver来自Newtonsoft.Json.Serialization,因此您需要从nuget软件包管理器安装Newtonsoft.Json
并添加*使用Newtonsoft.Json*和*使用Newtonsoft.Json.Serialization;*到我们创建的MyClass.cs文件
CreateProperty和MemberInfo来自System.Reflection;所以添加*使用System.Reflection;*为了进口它们
我们想让它在整个项目域中都可以访问,因此我们将在Global.asax文件中实例化该类,因此找到并打开Global.asax并添加以下内容
到受保护的void应用程序的启动方法
注意:确保使用Newtonsoft.Json添加*和*使用您的projectname.Models*
在Global.asax文件中
瞧!!!。。。。您可以运行项目以查看结果。不要直接转到datatable,反序列化为自定义类,然后根据需要将其转换为datatable。是否有一个选项可以在不创建类的情况下删除空数组成员?我正在尝试创建一个动态函数,可以删除任何空数组成员,JSON字符串有时可能不同。好的。我正在根据您的需要编辑源代码。您想从json中删除数组“property”。我不建议使用正则表达式来解析/操作json。它太容易出错。使用JObjects代替。同意Brian Rogers的观点,正则表达式更可能导致未来的问题,并且有更好的方法来处理这个问题。