【问题标题】:How to create structured/nested JSON from unstructured JSON in C#如何在 C# 中从非结构化 JSON 创建结构化/嵌套 JSON
【发布时间】:2022-11-24 14:45:24
【问题描述】:

我有以下 unstructured 但有效的 JSON 需要使用任何 C# librarynewtonsoft- 转换为 structured 格式

 {
    "root_id": {
        "Path": "InsertCases",
        "MainContract": "CreateCaseParameter"
    },
    "root_tittel": {
        "Path": "InsertCases",
        "MainContract": "CreateCaseParameter"
    },          
    "root_mottaker_adresse1": {
        "Path": "InsertDocuments",
        "MainContract": "CreateDocumentParameter"
    },
    "root_mottaker_adresse2": {
        "Path": "InsertCases",
        "MainContract": "CreateCaseParameter"
    },
    "root_web_id_guid": {
        "Path": "InsertCases",
        "MainContract": "CreateCaseParameter"
    }
}

想让它的结构如下 -

{
    "id": {
        "Path": "InsertCases",
        "MainContract": "CreateCaseParameter"
    },
    "tittel": {
        "Path": "InsertCases",
        "MainContract": "CreateCaseParameter"
    },              
    "mottaker": {
        "adresse1": {
            "Path": "InsertDocuments",
            "MainContract": "CreateDocumentParameter"
        },
        "adresse2": {
            "Path": "InsertCases",
            "MainContract": "CreateCaseParameter"
        }
    },
    "web": {
        "id": {
            "guid": {
                "Path": "InsertCases",
                "MainContract": "CreateCaseParameter"
            }
        }
    }
}

如果您看到差异,层次结构将被 _(下划线)分割。我想以更嵌套的方式制作它。

IE。

  1. root_element -> 元素
  2. root_element1_element2 -> 元素 1 是父元素,元素 2 是子元素。

    提前致谢!

【问题讨论】:

  • 好吧,这似乎很清楚你想做什么。在我看来,它有两个主要方面:“理解”原始输入,以及在进行过程中构建输出。目前哪部分有困难?你能展示你有多远吗?
  • @JonSkeet 在答案中发布了我的代码,以防万一您认为这可以通过任何其他优化方式完成。请回答。

标签: c# json .net json.net nested-json


【解决方案1】:

好吧,我在下面尝试了这段代码以获得预期的输出,但我仍然需要一种优化的方法来实现同样的结果。

JObject obj = JObject.Parse(jsonString);
            JObject finalObj = new JObject();
            foreach (var item in obj)
            {
                var keys = item.Key.Replace("root_", "").Split("_").Reverse();
                bool nestedKeyProcessed = false;
                JObject tempObj = new JObject();
                foreach (string key in keys)
                {
                    if (keys.Count() > 1 && !nestedKeyProcessed)
                    {
                        tempObj = CreateJObject(key, item.Value);
                        nestedKeyProcessed = true;
                    }
                    else
                    {
                        if (keys.Count() == 1)
                            finalObj.Add(new JProperty(key, item.Value));
                        else
                            tempObj = CreateJObjectUsingJProperty(key, tempObj);
                    }
                }
                if (keys.Count() > 1)
                    finalObj.Merge(tempObj, new JsonMergeSettings { MergeArrayHandling = MergeArrayHandling.Union });
            }
            string json = JsonConvert.SerializeObject(finalObj);
            JObject CreateJObject(string key, JToken? data)
            {
                JObject obj = new JObject();
                obj.Add(key, data);
                return obj;
            }
            JObject CreateJObjectUsingJProperty(string key, object? data)
            {
                JObject obj = new JObject(new JProperty(key, data));
                return obj;
            }

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 2021-11-19
    • 2015-09-03
    • 2022-10-16
    • 2021-11-14
    • 2020-04-29
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多