我正在整个项目中使用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
答案 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)