public class Car
{
// included in JSON
public string Model { get; set; }
public DateTime Year { get; set; }
public List<string> Features { get; set; }
// ignored
[JsonIgnore]
public DateTime LastModified { get; set; }
}
[DataContract]
public class Computer
{
// included in JSON
[DataMember]
public string Name { get; set; }
[DataMember]
public decimal SalePrice { get; set; }
// ignored
public string Manufacture { get; set; }
public int StockCount { get; set; }
public decimal WholeSalePrice { get; set; }
public DateTime NextShipmentDate { get; set; }
}
public class User {
public int Id { get; set; }
public string Name { get; set; }
[ScriptIgnore]
public bool IsComplete
{
get { return Id > 0 && !string.IsNullOrEmpty(Name); }
}
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
[ScriptIgnore]
public bool IsComplete
{
get { return Id > 0 && !string.IsNullOrEmpty(Name); }
}
}
public class LabMethodConverter : JsonConverter<ICollection<LabMethod>>
{
public override ICollection<LabMethod> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
//deserialize JSON into a ICollection<LabMethod>
return null;
}
public override void Write(Utf8JsonWriter writer, ICollection<LabMethod> value, JsonSerializerOptions options)
{
//serialize a ICollection<LabMethod> object
writer.WriteNullValue();
}
}
然后在序列化Json时添加到选项
var options = new JsonSerializerOptions();
options.Converters.Add(new LabMethodConverter());
var new_obj = Json(new { rows = slice, total = count }, options);
9条答案
按热度按时间eqfvzcg81#
如果你使用的是Json.Net属性
[JsonIgnore]
在序列化或反序列化时会忽略字段/属性。或者,您可以使用DataContract和DataMember属性来选择性地序列化/反序列化属性/字段。
有关详细信息,请参阅http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size
czfnxgou2#
**如果你在.NET framework中使用
System.Web.Script.Serialization
**你可以在不应该被序列化的成员上放置一个ScriptIgnore
属性。请看here的例子:考虑以下(简化)情况:
在这种情况下,只有Id和Name属性将被序列化,因此生成的JSON对象将如下所示:
**PS.**不要忘记添加对“
System.Web.Extensions
“的引用,这样才能正常工作exdqitrt3#
如果你不想用一些属性来修饰属性,或者你没有访问类的权限,或者你想决定在运行时 * 序列化什么,下面是你的操作方法:
1.在Newtonsoft.Json中
Newtonsoft的解决方案非常简单:
用途
如果您决定使用这个答案,请确保缓存
ContractResolver
对象,否则性能可能会受到影响。我在这里发布了代码,以防有人想添加任何东西:https://github.com/jitbit/JsonIgnoreProps
2.在
System.Text.Json
中.NET核心默认使用
System.Text.Json
,它更快,但你没有Newtonsoft的所有灵活性。然而,这里有一些在运行时排除属性***的解决方案***:1.在.NET 7及更高版本中,您可以控制哪些属性被序列化,如下所述:https://devblogs.microsoft.com/dotnet/system-text-json-in-dotnet-7/#example-conditional-serialization
1.在.NET 6(及更低版本)中,你可以强制转换到一个接口(我个人认为这是最干净的)或使用Map器。这两个选项都在本答案https://stackoverflow.com/a/61344654/56621中描述
nx7onnlm4#
可以使用
[ScriptIgnore]
:在这种情况下,将只序列化Id和名称
ejk8hzay5#
如果你不像我一样热衷于用属性来装饰代码,尤其是当你在编译时无法判断会发生什么的时候,这里是我的解决方案。
使用JavaScript序列化程序
jgwigjjp6#
如果你使用的是
System.Text.Json
,那么你可以使用[JsonIgnore]
。FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
官方Microsoft文档:JsonIgnoreAttribute
如here所述:
该库作为.NET Core 3.0共享框架的一部分内置。
对于其他目标框架,请安装System.Text.Json NuGet包。该软件包支持:
pu3pd22g7#
对于C# 9的记录,它是
[property: JsonIgnore]
对于经典样式,它仍然只是
[JsonIgnore]
。ivqmmu1c8#
也可以使用
[NonSerialized]
属性From the MS docs:
指示不应序列化可序列化类的字段。这个类不能被继承。
例如,如果您使用Unity(这不仅适用于Unity),那么这适用于
UnityEngine.JsonUtility
ve7v8dk29#
为dotnet核心添加System.Text.Json版本
对于编译时,按照上面的答案添加[JsonIgnore]。
对于运行时,需要将JsonConverter添加到选项中。
首先,为要排除的类型创建一个JsonConverter,例如下面的
ICollection<LabMethod>
然后在序列化Json时添加到选项