在C#中使用带有JSON的动态类型

时间:2014-12-18 18:52:07

标签: c# asp.net-mvc

我有一个ASP.NET MVC应用程序。我试图从我的应用程序中的控制器点击外部Web服务。目前,我正在点击这样的网络服务:

using (var client = new HttpClient())
{
  client.BaseAddress = new Uri(baseAddress);
  client.DefaultRequestHeaders.Accept.Clear();
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

  var response = await client.GetAsync(GetServiceUrl());
  dynamic data = System.Web.Helpers.Json.Decode(...)
}

Web服务的结果可以在JSON中有三种不同的模式。它们看起来像这样;

架构1

{
  "request":"some info",
  "value": [
    {"id":1, name:"bill" },
    {"id":2, name:"john" }
  ]
}

架构2

{
  "request":"some info",
  "value": [
    { "orderId":"A12345", orderDate:"10-12-2014" },
    { "orderId":"B31234", orderDate:"11-01-2014" },
    { "orderId":"C36512", orderDate:"12-03-2014" },
  ]
}

架构3

{
  "request":"some info",
  "value": [
    { "productId":"11-22-33", "name":"ball", "description":"a round thing" },
    { "productId":"3A-12-52", "name":"tire", "description":"keeps you moving" },
    { "productId":"7D-xy-23", "name":"plate", "description":"something to eat off of." },
  ]
}

如果可能的话,我想避免写三个单独的课程。我真的只想做两件事:1)计算value数组中的对象数。 2)循环遍历value数组中的对象,并通过Razor打印出一些值。

我可以在不创建3个新类的情况下完成这两件事吗?如果是这样,怎么样?

感谢你!

1 个答案:

答案 0 :(得分:1)

假设您使用的是json.net,则可以使用JObjectJArray

var json = @"{'value': [ { 'id' : 1}, { 'id' : 2 } ]}";
var jObject = JObject.Parse(json);
var values = (JArray) jObject["value"];
Console.WriteLine("Number of items: {0}", values.Count);

foreach (var value in values)
{
    // do something with value.
}

如果您不使用json.net,可以使用Robert Harvey的建议并使用JavaScriptSerializer

var jsonDict = serializer.Deserialize<IDictionary<string, object>>(json);
var array = (IEnumerable<object>) jsonDict["value"];