2016-12-14 58 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)