首页 文章

使用Json.net将json对象反序列化为动态对象

提问于
浏览
368

是否可以使用json.net从json反序列化返回动态对象?我想做这样的事情:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

8 回答

  • 38

    最新的json.net版本允许这样做:

    dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");
    
    Console.WriteLine(d.number);
    Console.WriteLine(d.str);
    Console.WriteLine(d.array.Count);
    

    输出:

    1000
     string
     6
    

    文档: LINQ to JSON with Json.NET

  • 474

    从Json.NET 4.0 Release 1开始,有本机动态支持:

    [Test]
    public void DynamicDeserialization()
    {
        dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
        jsonResponse.Works = true;
        Console.WriteLine(jsonResponse.message); // Hi
        Console.WriteLine(jsonResponse.Works); // True
        Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
        Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
        Assert.That(jsonResponse, Is.TypeOf<JObject>());
    }
    

    当然,获得当前版本的最佳方式是通过NuGet .

    Updated (11/12/2014) to address comments:

    这完全没问题 . 如果在调试器中检查类型,您将看到该值实际上是动态的 . 基础类型是 JObject . 如果要控制类型(如指定 ExpandoObject ,则执行此操作 .

    enter image description here

  • 0

    如果你只是反序列化为动态,你将得到一个JObject . 您可以使用ExpandoObject获得所需内容 .

    var converter = new ExpandoObjectConverter();    
    dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
    
  • 17

    我知道这是旧帖子,但JsonConvert实际上有一个不同的方法,所以它会

    var product = new { Name = "", Price = 0 };
    var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
    
  • 44

    是的,你可以使用JsonConvert.DeserializeObject来做到这一点 . 要做到这一点,只需简单做:

    dynamic jsonResponse = JsonConvert.DeserializeObject(json);
    Console.WriteLine(jsonResponse["message"]);
    
  • 4

    Note: 当我在2010年回答这个问题时,如果没有某种类型,就无法反序列化,这允许你反序列化而不必定义实际的类并允许使用匿名类来进行反序列化 .


    你需要有某种类型来反序列化 . 你可以做一些事情:

    var product = new { Name = "", Price = 0 };
    dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
    

    我的回答是基于.NET 4.0在JSON序列化器中构建的解决方案 . 链接到反序列化为匿名类型在这里:

    http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx

  • 94

    如果您使用JSON.NET与旧版本没有JObject .

    这是从JSON生成动态对象的另一种简单方法:https://github.com/chsword/jdynamic

    NuGet安装

    PM> Install-Package JDynamic
    

    支持使用字符串索引访问成员,如:

    dynamic json = new JDynamic("{a:{a:1}}");
    Assert.AreEqual(1, json["a"]["a"]);
    

    测试用例

    您可以使用此util如下:

    直接获取 Value

    dynamic json = new JDynamic("1");
    
    //json.Value
    

    2.获取json对象中的成员

    dynamic json = new JDynamic("{a:'abc'}");
    //json.a is a string "abc"
    
    dynamic json = new JDynamic("{a:3.1416}");
    //json.a is 3.1416m
    
    dynamic json = new JDynamic("{a:1}");
    //json.a is integer: 1
    

    3.IEnumerable

    dynamic json = new JDynamic("[1,2,3]");
    /json.Length/json.Count is 3
    //And you can use json[0]/ json[2] to get the elements
    
    dynamic json = new JDynamic("{a:[1,2,3]}");
    //json.a.Length /json.a.Count is 3.
    //And you can use  json.a[0]/ json.a[2] to get the elements
    
    dynamic json = new JDynamic("[{b:1},{c:1}]");
    //json.Length/json.Count is 2.
    //And you can use the  json[0].b/json[1].c to get the num.
    

    其他

    dynamic json = new JDynamic("{a:{a:1} }");
    
    //json.a.a is 1.
    
  • 20

    对的,这是可能的 . 我一直这样做 .

    dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
    

    对于非本机类型,它有点棘手 . 假设你的Obj中有一个ClassA和ClassB对象 . 它们都转换为JObject . 你需要做的是:

    ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
    ClassB ObjB = Obj.ObjB.ToObject<ClassB>();
    

相关问题