在C#中将JSON对象转换成扩展对象

20

我有一个 JSON 对象,类似于:

var jsonObject = {"att1" : "val1","att2" : "val2","att3" : "val3","att4" : "val4"}
我需要将其转换为ExpandoObject。 我尝试过以下代码:
var expConverter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<List<ExpandoObject>>(jsonObject, 
                                                                 expConverter);

但它没有给我想要的结果。

有人可以帮我得到结果吗?


5
“但它没有给出结果”并没有告诉我们发生了什么事情。请提供一个简短但完整的程序,演示问题,包括预期和实际结果。 - Jon Skeet
1
你不应该使用 dynamic。将整个内容强制转换为 List<ExpandoObject> - Erwin
3
你正在尝试将一个非数组的JSON转换为List<>。如果你查看运行代码时产生的错误,你会发现错误提示你正在尝试这样做。 - Bernd Linde
1
此外,JSON确实不是一个数组,因此它在C#中无法转换为数组 :) - Erwin
1
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter); 运行得非常好... - stefankmitph
2个回答

28
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter);

你的JSON对象不是数组,所以无法序列化为List<>。直接将对象序列化即可。


1
提示:如果您在 LinqPad 中探索它,您需要在转储之前将其转换为对象,例如:((object)obj).Dump(); 这将显示整个对象。 - Matt
似乎对于深度嵌套的结构不起作用。 - Casper Bang

1

我看到了两个问题,阻止了代码的工作:

  1. 您的 jsonObject 声明语法不正确。将其声明为字符串,并在字符串内使用转义“斜杠 + 双引号”来表示每个双引号:
    var jsonObject = "{\"att1\": \"val1\",\"att2\": \"val2\",\"att3\": \"val3\",\"att4\": \"val4\"}";

  2. 然后,在使用 Newtonsoft.Json.Converters 时,类型参数中需要使用 ExpandoObject,而不是 List<ExpandoObject>,因为 ExpandoObject 已经包含字典(而非列表):
    dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter);

以下代码修复了上述两个问题,并在屏幕上显示了键/值对:

using System.Dynamic;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

void Main()
{
  // 1. this needs to be a string
  var jsonObject =  
    "{\"att1\": \"val1\",\"att2\": \"val2\",\"att3\": \"val3\",\"att4\": \"val4\"}";

  var expConverter = new ExpandoObjectConverter();

  // 2. the correct type argument is ExpandoObject
  dynamic obj = 
              JsonConvert.DeserializeObject<ExpandoObject>(jsonObject, expConverter);

  // display the keys and values on screen
  foreach (var o in obj)
  {
    Console.WriteLine($"{o.Key}, {o.Value}");
  }
}

输出结果为:

att1, val1
att2, val2
att3, val3
att4, val4

注意:您可以轻松地将Expando转换为字典(内部已经是IDictionary),如下所示:

var dict = new Dictionary<string, object>(obj);

这允许在LinqPad中执行dict.Dump()(ExpandoObject不支持)


如果您正在LinqPad中尝试,请按F4并添加NUGET包Json.NET(如果您没有付费版本的LinqPad,则NUGET功能受到限制-在这种情况下,请尝试Rock.Core.Newtonsoft)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接