Newtonsoft Json.Net - 如何避免使用Json属性?

时间:2016-12-14 20:10:03

标签: c# json json.net

我正在整个项目中使用Json.Net Newtonsoft组件。

我偶尔会偶然发现图书馆的实施细节。例如,当我获取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”子句中抛出异常。

我想知道在不要求澄清的情况下,对stackoverflow进行投票是否是常见做法。好文化。 (我可以理解,一些对新技术不熟悉的人会不鼓励提出问题)

谢谢, AD

2 个答案:

答案 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 :(得分: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)