如何使Newtonsoft.Json.Linq.JObject不可变?

我可以创建JObject

var jobject = Newtonsoft.Json.Linq.JObject.Parse(jsonstring); 

我想将jobject转换为只读,以便不能添加新密钥或修改现有值。

它无法完成。 实施它有一个未解决的问题:

https://github.com/JamesNK/Newtonsoft.Json/issues/468

但它已经两年了,据我所知,很少引起人们的注意。

不可变对象是无法更改的对象。 如果您不希望JObject的消费者更改它,请给他们一份副本。 (注意:此示例使用JToken的抽象超类JObject来提供更通用的解决方案。)

 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)来获取子集。