【问题标题】:Newtonsoft Json.Net - How to avoid using Json properties?Newtonsoft Json.Net - 如何避免使用 Json 属性?
【发布时间】:2016-12-14 20:10:03
【问题描述】:

我在整个工作项目中都使用 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 上是否有一种常见的做法,即在不要求澄清的情况下对人们投反对票。不错的文化。 (我可以接受,一些刚接触给定技术的人根本不鼓励提问)

谢谢, 广告

【问题讨论】:

  • 您可以定义强类型类并反序列化为那些而不是使用动态类。

标签: c# json json.net


【解决方案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

【讨论】:

    【解决方案2】:

    您有很多选项可以使用 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)
    

    【讨论】:

    • ds3 的转换失败。我一直在调试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多