如何使 Newtonsoft.Json.Linq.JObject 不可变?
How to make Newtonsoft.Json.Linq.JObject immutable?
我可以创建 JObject
var jobject = Newtonsoft.Json.Linq.JObject.Parse(jsonstring);
我想将 jobject 转换为只读,这样就不能添加新键或修改现有值。
做不到。实施它有一个未解决的问题:
https://github.com/JamesNK/Newtonsoft.Json/issues/468
但它已有两年历史,据我所知很少有人关注。
不可变对象是无法更改的对象。如果您不希望 JObject 的使用者更改它,只需给他们一份副本即可。 (注意:此示例使用 JObject
的抽象超类 JToken
来提供更通用的解决方案。)
private JToken data = JToken.Parse(@"{""Some"":""JSON""}");
public JToken Data()
{
return data.DeepClone();
}
public JToken Data(string path)
{
return data.SelectToken(path).DeepClone();
}
消费者将能够更改他们的副本,但不能更改来源。
如果 data
太大以至于无法克隆它,请使用第二种方法 JToken Data(string path)
获取一个子集。
我可以创建 JObject
var jobject = Newtonsoft.Json.Linq.JObject.Parse(jsonstring);
我想将 jobject 转换为只读,这样就不能添加新键或修改现有值。
做不到。实施它有一个未解决的问题:
https://github.com/JamesNK/Newtonsoft.Json/issues/468
但它已有两年历史,据我所知很少有人关注。
不可变对象是无法更改的对象。如果您不希望 JObject 的使用者更改它,只需给他们一份副本即可。 (注意:此示例使用 JObject
的抽象超类 JToken
来提供更通用的解决方案。)
private JToken data = JToken.Parse(@"{""Some"":""JSON""}");
public JToken Data()
{
return data.DeepClone();
}
public JToken Data(string path)
{
return data.SelectToken(path).DeepClone();
}
消费者将能够更改他们的副本,但不能更改来源。
如果 data
太大以至于无法克隆它,请使用第二种方法 JToken Data(string path)
获取一个子集。