C# 如何从JSON中删除不需要的字符串属性
假设我的输入是以下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
{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作为字符串呢。