在JObject []过滤和匹配中苦苦挣扎

时间:2017-04-20 17:21:10

标签: c# .net json modeling

我正在使用JsonClassGenerator项目将Json特定转换为C#类。

这是针对我正在构建的一些中间件,以挂钩我公司已经构建的TrackVia API项目。

我正在构建我的.Net应用程序中的数据层

基本上我有一个Json结构,我需要解析它以确定我是否应该根据它在“结构”中的“canUpdate”值序列化“data”中的一个属性。

让我们从Json结构开始:

{
  "structure": [
    {
      "name": "Updated",
      "type": "datetime",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "Amount",
      "type": "currency",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "Description",
      "type": "paragraph",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "Created",
      "type": "datetime",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "Quantity",
      "type": "number",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": true,
      "canCreate": true
    },
    {
      "name": "Created By User",
      "type": "user",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "ID",
      "type": "number",
      "required": false,
      "unique": true,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "Last User",
      "type": "user",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    },
    {
      "name": "Unit_Tracker",
      "type": "relationship",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": true,
      "canCreate": true
    },
    {
      "name": "Project_Materials",
      "type": "relationship",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": true,
      "canCreate": true
    },
    {
      "name": "Record ID",
      "type": "identifier",
      "required": false,
      "unique": false,
      "canRead": true,
      "canUpdate": false,
      "canCreate": false
    }
  ],
  "data": [
    {
      "Updated": "2017-04-20T10:12:00.000-06:00",
      "Project_Materials(id)": 404,
      "Unit_Tracker(id)": 209,
      "Amount": "78.18",
      "Description": "1/2 in",
      "Quantity": "1",
      "Created By User": "By",
      "Unit_Tracker": "R04-5050",
      "Project_Materials": "1001755734",
      "id": 772,
      "Created": "2017-04-20T10:12:00.000-06:00",
      "Last User": "By",
      "Last User(id)": 58443,
      "Created By User(id)": 58443,
      "Record ID": "1/2 in"
    }
  ],
  "totalCount": 763
}

这是我需要匹配的内容。我需要将“数据”中的密钥,即“更新”与“结构”内的键值匹配,即结构 - > “name”:“Updated”然后确定“canRead”,“canUpdate”,“canCreate”的值来设置某种标志。

然后该标志将告诉Codewriter添加一行“[JsonIgnoreSerialization]”并在我的输出文本中生成一个格式化的属性,如下所示:

        [JsonIgnoreSerialization]
        [JsonProperty("Updated")]
        public string Updated { get; set; }

我甚至没有使用过JObjects,因此我的代码目前为空,因为我不确切知道从哪里开始。

这是一个大问题的原因是因为我必须根据他们的API中的Json导出将Trackvia中的数百个表转换为我的应用程序中的C#类 - 这将需要数周的时间并且希望拥有自定义的转换工具为我构建我的C#类 - 所以它会很棒。

不寻找讲义,我愿意为自己的成功而努力需要一些指导。

1 个答案:

答案 0 :(得分:0)

试试这个自定义类结构

public class Root
{
    public List<Structure> structure;
}

public class Structure
{
    public string name { get; set; }
    public string type { get; set; }
    public string required { get; set; }
    public string unique { get; set; }
    public string canRead { get; set; }
    public string canUpdate { get; set; }
    public string canCreate { get; set; }
}

并使用以下代码访问canUpdate属性。

using (var stream = new StreamReader("sample.json"))
{

     var rootObject = JsonConvert.DeserializeObject<Root>(stream.ReadToEnd());
     int index = 0;
     foreach (var structures in rootObject.structure)
     {
          Console.WriteLine(structures.canUpdate);
     }
}

注意: sample.json包含您的JSON响应。