2015-10-28 27 views
3

我可以創建JObject如何使Newtonsoft.Json.Linq.JObject不可變?

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

我要轉換的jobject只讀,以便沒有新的密鑰可以添加或現有的值修改。

+1

'jobject'的範圍是什麼?會[C#公共變量作爲可寫內部類但只讀類外](http://stackoverflow.com/a/4662190/1115360)對你有用嗎? –

+0

@AndrewMorton我不控制JObject類。我可以在它周圍寫一個包裝,但它不會是微不足道的。 – Rohit

+1

您不需要改變JObject類,而只需控制對「jobject」實例的訪問。或者你是說所有* JObject的實例必須是隻讀的? –

回答

1

不可變的對象是一個無法更改的對象。如果你不想讓你的JObject的用戶改變它,只需給他們一個副本。 (注:本例中使用抽象超的JObjectJToken提供了更通用的解決方案。)

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)來獲取子集。