【问题标题】:Modifying JSON Hierarchy to move a key down and convert it into a K/V pair C#修改 JSON Hierarchy 以将键向下移动并将其转换为 K/V 对 C#
【发布时间】:2021-06-16 08:49:32
【问题描述】:

基本上我需要这个:

    "/xxx/dynamicFileName1": {
    "lines": {
        "total": 8,
        "covered": 4,
        "skipped": 0,
        "pct": 50
    },
    "functions": {
        "total": 1,
        "covered": 0,
        "skipped": 0,
        "pct": 0
    },
    "statements": {
        "total": 8,
        "covered": 4,
        "skipped": 0,
        "pct": 50
    },
    "branches": {
        "total": 2,
        "covered": 0,
        "skipped": 0,
        "pct": 0
    }
},
"/xxx/dynamicFileName2": {
    "lines": {
        "total": 13,
        "covered": 4,
        "skipped": 0,
        "pct": 30.77
    },
    "functions": {
        "total": 1,
        "covered": 0,
        "skipped": 0,
        "pct": 0
    },
    "statements": {
        "total": 13,
        "covered": 4,
        "skipped": 0,
        "pct": 30.77
    },
    "branches": {
        "total": 12,
        "covered": 0,
        "skipped": 0,
        "pct": 0
    }
}

变成这样:(动态文件名键下移,作为键值对中的值)

{
"results": [{
        "Name": "/xxx/dynamicFileName1",
        "lines": {
            "total": 3321,
            "covered": 853,
            "skipped": 0,
            "pct": 25.69
        },
        "statements": {
            "total": 3327,
            "covered": 853,
            "skipped": 0,
            "pct": 25.64
        },
        "functions": {
            "total": 724,
            "covered": 36,
            "skipped": 0,
            "pct": 4.97
        },
        "branches": {
            "total": 1984,
            "covered": 42,
            "skipped": 0,
            "pct": 2.12
        }
    },
    {
        "Name": "/xxx/dynamicFileName2",
        "lines": {
            "total": 3321,
            "covered": 853,
            "skipped": 0,
            "pct": 25.69
        },
        "statements": {
            "total": 3327,
            "covered": 853,
            "skipped": 0,
            "pct": 25.64
        },
        "functions": {
            "total": 724,
            "covered": 36,
            "skipped": 0,
            "pct": 4.97
        },
        "branches": {
            "total": 1984,
            "covered": 42,
            "skipped": 0,
            "pct": 2.12
        }
    }
]}

我正在尝试将上述 JSON 反序列化为类。 想知道以前有没有人处理过这样的问题?我一直在阅读 NewtonSoft 文档,但我无法将任何东西拼凑在一起。任何帮助将不胜感激。

【问题讨论】:

  • Dictionary<string, object>中反序列化,进行转换并重新序列化。
  • 您在这里要解决的实际问题是什么?您是否尝试将第一个 JSON 转换为第二个 JSON?还是您只是想将第一个 JSON 反序列化为类似于第二个 JSON 的类结构?
  • @BrianRogers 将第一个 JSON 反序列化为类似于第二个 JSON 的类结构

标签: c# json json.net


【解决方案1】:

第二个JSON对应的类结构如下:

public class RootObject
{
    public List<Result> Results { get; set; }
}

public class Result
{
    public string Name { get; set; }
    public Statistics Lines { get; set; }
    public Statistics Statements { get; set; }
    public Statistics Functions { get; set; }
    public Statistics Branches { get; set; }
}

public class Statistics
{
    public int Total { get; set; }
    public int Covered { get; set; }
    public int Skipped { get; set; }
    public float Pct { get; set; }
}

以下是将第一个 JSON 反序列化为此类结构所需的代码。它将 JSON 加载到 JObject 中,将每个动态键移动到其各自子对象上的 Name 属性中,将子对象收集到列表中,最后将列表放入新的 RootObject 实例中。

var root = new RootObject
{
    Results = JObject.Parse(json)
        .Properties()
        .Select(jp =>
        {
            JObject item = (JObject)jp.Value;
            item.AddFirst(new JProperty("Name", jp.Name));
            return item.ToObject<Result>();
        })
        .ToList()
};

这是一个工作演示:https://dotnetfiddle.net/30xova

【讨论】:

  • 感谢 Brian,我修改了您编写的代码以适应我自己的项目接口和类,但这帮助很大。接受这个作为答案
  • 很高兴能帮上忙!
猜你喜欢
  • 2018-11-23
  • 2013-04-13
  • 2022-01-23
  • 2018-08-18
  • 1970-01-01
  • 2018-12-12
  • 2019-01-23
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多