使用C#进行数据映射的动态json字段模式

时间:2016-03-24 15:47:08

标签: c# json dynamic mapping

我从Web API获取此类型的JSON数据:

Data: {
  FromDate: "2016-03-01",
  Comment: "Bla bla",
  ...
},
FieldInfo: {
  Items: [
  {
    Id: "FromDate",
    Required: true,
    DataType: "date"
  },
  {
    Id: "Comment",
    Required: true,
    DataType: "string"
  },
  ...
  ]
}

我需要将它序列化为C#对象并将其转换为不同的代表,它应该看起来像这样:

  {
    FieldInfo: {
      Items: [
      {
        Id: "FromDate",
        Required: true,
        DataType: "date",
        Value: "2016-03-01"
      },
      {
        Id: "Comment",
        Required: true,
        DataType: "string"
        Value: "Bla bla"
      },
      ...
      ]
   }

基本上将字段值映射到其架构,因此不会将其分开。 当然,它最简单的方法是为每个字段编写很多if,这不是非常优雅的解决方案,如果我们考虑到字段模式和字段是动态的,它们可以改变,甚至是不可行的。我可以依赖的属性是FieldInfo项模式中的Id,它应该是Data对象中的属性名。其中一个解决方案可能是使用反射,以便将Id值映射到C#对象表示中的属性名称。我的问题可能是这个问题的另一个解决方案或一些可以帮助我实现这个目标的工具?

2 个答案:

答案 0 :(得分:3)

使用JSON.NET,您可以将JSON解析为JObject并按照以下方式对其进行操作:

// Parse your json string into a JObject
JObject o = JObject.Parse(json);

// Retrieve the "Data" part of the json, i.e, 
// the object that contains the values
var data = o["Data"];

// Retrieve the "FieldInfo" part. We will add values to this part.
var fieldInfo = o["FieldInfo"];

foreach (var token in fieldInfo["Items"])
{
    var item = (JObject) token;

    // Add the Value property to each item, get the value from the
    // corresponding field
    item["Value"] = data[(string)item["Id"]];
}

变量fieldInfo将包含您想要的信息。当然,创建一个新的JObject以包含信息会更清晰。但该示例显示了如何检索和映射所需的值。

答案 1 :(得分:1)

您必须实现某种形式的自定义json转换器,以获得您希望新类结构所需的输出。 JSON.NET自定义JsonConverter:

http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

这是一个很好的初学者教程,讲述如何实现这一目标:

http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx