2016-12-14 21 views
-1

我在工作中使用了Json.Net Newtonsoft組件。Newtonsoft Json.Net - 如何避免使用Json屬性?

有時我偶然發現圖書館的實施細節。例如,當我獲取JProperty的值時,我不得不使用.Value屬性:

var displaySettings = options.DisplaySettings.Value;

這很煩人,因爲人們必須記住,給定的動態對象的屬性可以通過「Value」屬性真正地檢索,而不需要在運行時真正知道它的類型。 (此外,還有更多的linq代碼來選擇「值」,這會使代碼混亂)

有沒有一種方法可以輕鬆地包裝Json對象,或者使用Newtonsoft組件更正確的方式?


我看到我得到了投票,但我認爲JObject封裝存在問題。

如果我使用「var」來存儲bool變量,測試會失敗,因爲變量將包含JValue對象。

[Test] 
public void TestProperties() 
{ 
    dynamic testee = JsonConvert.DeserializeObject(@" 
    { 
     TestBool:true 
    } 
    "); 
    var result = testee.TestBool; 

    Assert.That(result, Is.EqualTo(true)); 
} 

此測試將通過:

Assert.That(result.Value, Is.EqualTo(true)); 

測試將導致:

預計:真 卻被:

此外,爲了證明這是不NUnit的問題:

dynamic testee = JsonConvert.DeserializeObject(@" 
{ 
    TestBool:true 
} 
"); 

var result = testee.TestBool; 

if (result) 
{ 
    Assert.Pass(); 
    return; 
} 

以上將拋出「if」子句的例外。

我不知道這是否是一種常見的做法,用於在不需要澄清的情況下對人進行降級投票。好的文化。 (我可以拿,有些新的給定技術的人就會失去所有提問)

感謝,AD

+0

您可以定義強類型類和反序列化到這些,而不是使用動態處理動態值。 –

回答

1

反序列化到C#類。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @"{ ""FirstName"":""Bob"" }"; 

     Person person = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(json); 

     Console.WriteLine(person.FirstName); 
    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
    } 
} 

http://www.newtonsoft.com/json/help/html/deserializeobject.htm

1

你有很多選擇與Json.Net

dynamic jobj = JObject.FromObject(new { DisplaySettings = "aaa" }); 

var ds1 = jobj.DisplaySettings; //ds1 is JValue 
var ds2 = jobj.DisplaySettings.Value; //ds2 is object (boxed string) 
var ds3 = (string)jobj.DisplaySettings; //ds3 is string (explicit casting) 
string ds4 = jobj.DisplaySettings; //ds4 is string (implicit casting)