Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从JSON中删除不需要的字符串属性_C#_Json_Json.net - Fatal编程技术网

C# 如何从JSON中删除不需要的字符串属性

C# 如何从JSON中删除不需要的字符串属性,c#,json,json.net,C#,Json,Json.net,假设我的输入是以下JSON: {obj: { x: "", y: "test str" }, myStr: "Hi"} 我想删除所有空字符串和值为N/a的字符串,以便输出为: {obj: { y: "test str" }, myStr: "Hi"} 注意,上面的输入只是一个示例输入文件 我试着写一些代码: var serializerSettings = new JsonSerializer

假设我的输入是以下JSON:

{obj: { x: "", y: "test str" }, myStr: "Hi"}
我想删除所有空字符串和值为
N/a
的字符串,以便输出为:

{obj: { y: "test str" }, myStr: "Hi"}
注意,上面的输入只是一个示例输入文件

我试着写一些代码:

var serializerSettings = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    DefaultValueHandling = DefaultValueHandling.Ignore 
};
但我无法获得所需的输出。

请查看。 您应该在包含属性“x”的类中声明这样的方法:


要使用
DefaultValueHandling
忽略默认空字符串,需要将
DefaultValue
添加到x属性中

[DefaultValue("")]
public string x{ get; set; }
更新:

这里是一个链接到一个工作

使用系统;
使用Newtonsoft.Json;
使用系统组件模型;
公共课程
{
公共静态void Main()
{
//var myClass=new MyClasss();
//var myObj=新的Obj();
//myObj.x=“”;
//myObj.y=“测试str”;
//myClass.myStr=“Hi”;
//obj=myObj;
字符串json=@“{obj:{x:'',y:'teststr'},myStr:'Hi'}”;
MyClasss myClass=JsonConvert.DeserializeObject(json);
var settings=new JsonSerializerSettings();
settings.NullValueHandling=NullValueHandling.Ignore;
settings.DefaultValueHandling=DefaultValueHandling.Ignore;
WriteLine(JsonConvert.SerializeObject(myClass,设置));
}
}
公共类Obj{
[默认值(“”)
公共字符串x{get;set;}
[默认值(“”)
公共字符串y{get;set;}
}
公共类MyClasss{
公共对象对象{get;set;}
[默认值(“”)
公共字符串myStr{get;set;}
}

如果使用类模型反序列化到,则可以使用自定义的
ContractResolver
过滤掉序列化时不需要的属性:

class CustomContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var prop = base.CreateProperty(member, memberSerialization);
        if (prop.PropertyType == typeof(string) && prop.Readable)
        {
            prop.ShouldSerialize = obj =>
            {
                string val = (string)prop.ValueProvider.GetValue(obj);
                return !string.IsNullOrEmpty(val) && !val.Equals("N/A", StringComparison.OrdinalIgnoreCase);
            };
        }
        return prop;
    }
}
然后像这样使用它:

var obj = JsonConvert.DeserializeObject<YourClass>(inputJson);

var serializerSettings = new JsonSerializerSettings
{
    ContractResolver = new CustomContractResolver
    {
        NamingStrategy = new CamelCaseNamingStrategy()
    }
};

string outputJson = JsonConvert.SerializeObject(obj, serializerSettings);
var jo = JObject.Parse(inputJson);

var unwantedProperties = jo.Descendants()
    .OfType<JProperty>()
    .Where(p => p.Value.Type == JTokenType.Null ||
                (p.Value.Type == JTokenType.String &&
                 ((string)p.Value == string.Empty ||
                  string.Equals((string)p.Value, "N/A", StringComparison.OrdinalIgnoreCase))))
    .ToList();

foreach (var prop in unwantedProperties)
{
    prop.Remove();
}

string outputJson = jo.ToString(Formatting.None);
var obj=JsonConvert.DeserializeObject(inputJson);
var serializerSettings=new JsonSerializerSettings
{
ContractResolver=新的CustomContractResolver
{
NamingStrategy=新CamelCaseNamingStrategy()
}
};
string outputJson=JsonConvert.SerializeObject(obj,serializerSettings);
在此进行工作演示:


或者,您可以删除不需要的属性,而不使用如下类模型:

var obj = JsonConvert.DeserializeObject<YourClass>(inputJson);

var serializerSettings = new JsonSerializerSettings
{
    ContractResolver = new CustomContractResolver
    {
        NamingStrategy = new CamelCaseNamingStrategy()
    }
};

string outputJson = JsonConvert.SerializeObject(obj, serializerSettings);
var jo = JObject.Parse(inputJson);

var unwantedProperties = jo.Descendants()
    .OfType<JProperty>()
    .Where(p => p.Value.Type == JTokenType.Null ||
                (p.Value.Type == JTokenType.String &&
                 ((string)p.Value == string.Empty ||
                  string.Equals((string)p.Value, "N/A", StringComparison.OrdinalIgnoreCase))))
    .ToList();

foreach (var prop in unwantedProperties)
{
    prop.Remove();
}

string outputJson = jo.ToString(Formatting.None);
var jo=JObject.Parse(inputJson);
var unwantedProperties=jo.subjects()
第()类
.Where(p=>p.Value.Type==JTokenType.Null||
(p.Value.Type==JTokenType.String&&
((string)p.Value==string.Empty||
string.Equals((string)p.Value,“N/A”,StringComparison.OrdinalIgnoreCase)))
.ToList();
foreach(未经授权的财产中的var prop)
{
prop.Remove();
}
字符串outputJson=jo.ToString(格式化为.None);

演示:

x
不是空字符串,它是空字符串,两者都是可能的。这只是一个示例,“N/a字符串”是什么?你是指一个空字符串,还是一个包含“N/a”的字符串?@BrianRogers它的意思是包含N/a的字符串。我有点困惑。由于这是一个JSON字符串,我们如何按照您的建议处理它?是的,这适用于空字符串。但是如果它包含N/A作为字符串呢。