【发布时间】:2022-01-06 14:19:34
【问题描述】:
我想从 json 序列化中忽略序列化的私有字段,但似乎 [JsonIgnore] 仅适用于 public 字段,不适用于 [SerializeField] private 字段。有没有其他方法可以忽略这些字段?
这是一个示例类:
using UnityEngine;
using Newtonsoft.Json;
[JsonObject(MemberSerialization.OptIn)]
public class ExampleObject : MonoBehaviour {
[JsonProperty]
private string property = "Property";
[JsonIgnore]
[SerializeField]
private string ignored = "Ignored";
}
输出
{"property":"Property","ignored":"Ignored"}
它仍然将ignored 字段序列化为json,即使我在类上使用[JsonObject(MemberSerialization.OptIn)] 并在private 字段上使用[JsonIgnore]。
MemberSerialization.OptIn 这么说
“只有标有
JsonPropertyAttribute或System.Runtime.Serialization.DataMemberAttribute的成员才会被序列化”
,但它似乎也包含SerializeField 属性。
编辑:我正在使用 JilleJr Newtonsoft.Json-for-Unity (github link) 和 JilleJr Newtonsoft.Json-for-Unity.Converters(github link)
【问题讨论】:
-
[SerializeField]属性的作用是什么?
-
如果您想排除私有字段,那么为什么不使用默认的退出行为呢? 默认情况下,类型的属性以退出模式序列化。这意味着所有带有 getter 的公共字段和属性都会自动序列化为 JSON,并且不应该序列化的字段和属性会通过在其上放置 JsonIgnoreAttribute 来选择退出。要序列化私有成员,可以将 JsonPropertyAttribute 放在私有字段和属性上 - Source
-
您使用的是来自 nuget.org/packages/Newtonsoft.Json 的 Json.NET 还是某个 Unity 特定的端口?如果是这样,什么端口/版本?如果我只是序列化具有与
ExampleObject相同属性的 DTO,则不会序列化ignored,请参阅dotnetfiddle.net/ZeOSf7。这让我相信您使用的是针对 Unity 进行了调整的 Json.NET 版本,因为原版 Json.NET 不知道[SerializeField]。 -
@Serge 为什么不呢? ^^ 这就是 Unity Inspector 的工作方式,通常很有意义的是,字段是私有的但在 Inspector => 封装中暴露。该字段只能通过 Inspector 进行调整,不能以其他方式访问