我想忽略來自 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)]的類[JsonIgnore]的private領域。
MemberSerialization.OptIn 說
“只有標記有
JsonPropertyAttribute或 的成員System.Runtime.Serialization.DataMemberAttribute被序列化”
,但它似乎也包括SerializeField屬性。
編輯:我正在使用JilleJr Newtonsoft.Json-for-Unity(github鏈接)和JilleJr Newtonsoft.Json-for-Unity.Converters(github鏈接)
uj5u.com熱心網友回復:
問題是您正在使用的 Json.NET 埠JilleJr Newtonsoft.Json-for-Unity.Converters包含一個自定義合同決議器UnityTypeContractResolver,其中包括標記為 的成員,[SerializeField] 即使也標記為[JsonIgnore]。從來源:
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty jsonProperty = base.CreateProperty(member, memberSerialization); // A check for member.GetCustomAttribute<JsonIgnoreAttribute>() is missing in the following line: if (member.GetCustomAttribute<SerializeField>() != null) { jsonProperty.Ignored = false; jsonProperty.Writable = CanWriteMemberWithSerializeField(member); jsonProperty.Readable = CanReadMemberWithSerializeField(member); jsonProperty.HasMemberAttribute = true; } return jsonProperty; }
如果你不想要這個,你需要繼承這個合同決議器并糾正行為:
public class FixedUnityTypeContractResolver : Newtonsoft.Json.UnityConverters.UnityTypeContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty jsonProperty = base.CreateProperty(member, memberSerialization);
if (!jsonProperty.Ignored && member.GetCustomAttribute<Newtonsoft.Json.JsonIgnoreAttribute>() != null)
jsonProperty.Ignored = true;
return jsonProperty;
}
}
然后序列化如下:
// Cache and reuse the contract resolver throughout your project to improve performance.
static Newtonsoft.Json.Serialization.IContractResolver _resolver = new FixedUnityTypeContractResolver ();
var settings = new JsonSerializerSettings
{
ContractResolver = _resolver,
};
JsonConvert.SerializeObject(this, settings);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404624.html
標籤:
下一篇:如何用Json的內容填充變數
