从JSON字符串中删除空数组成员

时间:2016-05-23 11:33:32

标签: c# json json.net

我有一个JSON字符串,如下所示。我想以编程方式从中删除空数组对象,以便将其转换为{ "result":[ { "id":"1", "name": "Temp", "property":[] }, { "id":"2", "name": "Temp2", "property":[] } ] }

以下是我的JSON示例:

property

您可以看到每个结果中的DataTable成员是一个空数组。关于如何删除它的任何建议?

目前我正在执行以下操作将JSON转换为DataTable dt = JsonConvert.DeserializeObject<DataTable>(data["result"].ToString());

import pip
failed = pip.main(["install", nameOfPackage])

当我手动删除数组属性时,转换效果很好。

4 个答案:

答案 0 :(得分:1)

您可以使用正则表达式从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, "");

可能会有一种比这更清洁的方式,但我无法快速找到一种正则表达式来删除属性并清除潜在的非法逗号。

答案 1 :(得分:0)

这是您可以删除&#39;属性&#39;来自JSON的数组并将剩余数据解析为DataTable:

<?php
            if ( is_bbpress() ) {
                get_template_part('archive-forum'); 
            } else {
                // continue with the current template code   
            } 
            get_footer(); 
        ?>

答案 2 :(得分:0)

您可以使用Json.Net的LINQ-to-JSON API删除空数组属性(无论其名称如何),然后将结果转换为DataTable:

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>();

小提琴:https://dotnetfiddle.net/rVIijq

答案 3 :(得分:0)

要直接参考上述问题,我们可以使用IContractResolver解决该问题 其工作原理如下:

  1. 在项目模型文件夹中创建一个类,例如MyClass。
  2. 添加以下代码

    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;
        }
    }
    
  3. DefaultContractResolver来自Newtonsoft.Json.Serialization,因此您需要从nuget软件包管理器安装Newtonsoft.Json。 并使用Newtonsoft.Json *和*使用Newtonsoft.Json.Serialization添加; *到我们创建的MyClass.cs文件。

    1. CreateProperty和MemberInfo来自System.Reflection;因此,请使用System.Reflection添加*; *以便导入它们。

    2. 我们想使其在整个项目域中都可访问,因此我们将在Global.asax文件中实例化该类,因此找到并打开Global.asax并添加以下内容 到受保护的void Application_Start()方法。

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new MyClass();
    GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
    

    注意:请确保使用Newtonsoft.Json添加*; *和*使用YourProjectName.Models; * 在您的Global.asax文件中

Voila !!! ....您可以运行项目以查看结果。