使用JSON.net将JSON解析为匿名对象数组

15
我有一个json字符串,想要将它解析成一个对象数组:
{ "Thing":"Thing","That":{"Item1":15,"Item2":"Moo","Item3":{"Count":27,"Type":"Frog"}}}

生成的匿名对象数组需要包含原始 JSON 对象的每个属性。我的问题是 JsonConvert.DeserializeObject 返回 JContainer 或 JObject 类型。我还没有找到一种方法返回纯粹的 C# 对象。

这是我目前不起作用的代码,是之前多次尝试的结果。我不必使用 JSON.net,但如果可能的话,我想用它来确保与生成 JSON 的代码兼容。

JObject deserialized = JsonConvert.DeserializeObject<JObject>(dataString);
object[] data =
deserialized.Children().Where(x => x as JProperty != null).Select(x => x.Value<Object>()).ToArray();

更新

我正在使用生成的对象数组通过反射调用方法。在运行时,无法了解解析后的JSON对象的类型。问题所在是JObject或JContainer对象类型与被调用的方法的签名不匹配。动态类型也有同样的副作用。方法调用如下:

Type _executionType = typeof(CommandExecutionDummy);
CommandExecutionDummy provider = new CommandExecutionDummy();
var method = _executionType.GetMethod(model.Command,
               BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (method == null)
   throw new InvalidCommandException(String.Format("Invalid Command - A command with a name of {0} could not be found", model.Command));
return method.Invoke(provider, model.CommandData);

你想要实现什么? - dcastro
2
运行时类型为 Object 的对象将不具有任何属性。使用 JContainerJObject 或将其用作 dynamic 有什么问题? - Tim S.
4个回答

19

你可以通过示例进行反序列化,使用像这样的匿名类型:

string jsonString = "{name:\"me\",lastname:\"mylastname\"}";
var typeExample = new { name = "", lastname = "",data=new int[]{1,2,3} };
var result=JsonConvert.DeserializeAnonymousType(jsonString,typeExample);
int data1=result.data.Where(x => 1);

在Json.Net中的另一种方式是使用如下的动态对象:

dynamic result2=JObject.Parse(jsonString);

如果我不想创建JSON模板,“dynamic”类型是完美的选择://来自TFS REST API的对象 dynamic projects = JsonConvert.DeserializeObject<JObject>(jsonProjects); var projectName = projects.value[0].name; - Edward Weinert

6

在一个略微不同的用例中,如果JSON字符串是匿名类型的数组,则可以使用以下方法。基本上,它只是将匿名类型包装在数组中。

string json = "[{\"Type\":\"text/xml\",\"Allowed\":\"true\"},{\"Type\":\"application/pdf\",\"Allowed\":\"true\"},{\"Type\":\"text/plain\",\"Allowed\":\"true\"}]";
JsonConvert.DeserializeAnonymousType(json, new[] { new { Type = "", Allowed = true } });

这导致如下结果,由 Linqpad 可视化呈现。

enter image description here


1
string jsonString = "{ "Thing":"Thing","That":{"Item1":15,"Item2":"Moo","Item3":{"Count":27,"Type":"Frog"}}}"

Object[] data = JsonConvert.DeserializeObject<Object>(jsonString);

?

-1
JObject.Parse(jsonString).ToObject<MyType>()

?


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