c# - 在 C# 中反序列化动态命名的 JSON 对象(使用 JSON.Net 或其他方式)

标签 c# .net json serialization json.net

我有以下 JSON:

{
"aaaa": {
    "name": "General Name",
    "product": "book",
    "host": "book.example.com",
    "chapters": {
        "bbbb": {
            "name": "Chapter 1",
            "page": "1",
            "end_page": "25"
        }
    },
    "categories" : {
        "analysis":{
            "Abbbb" : {
                    "name": "B Chapter",
                    "id" : "9001"
            },
            "Acccc" : {
                    "name": "C Chapter",
                    "id" : "9001"
            },
            "Adddd" : {
                    "name": "D Chapter",
                    "id" : "9001"
            },
            "Aeeee" : {
                    "name": "E Chapter",
                    "id" : "9001"
            },
            "Affff" : {
                    "name": "F Chapter",
                    "id" : "9001"
            },
            "Agggg" : {
                    "name": "G Chapter",
                    "id" : "9001"
            }
        },
        "sources":{
            "acks" : {
                    "name": "S. Spielberg",
                    "id" : "9001"
            }
        }
    }
}
"yyyy": {
    "name": "Y General Name",
    "product": "Y book",
    "host": "ybook.example.com",
    ...
}
"zzzz": {
    "name": "Z General Name",
    "product": "Z book",
    "host": "zbook.example.com",
    ...
}

aaaa 的值, yyyy , 和 zzzz可以是任何字符串,并且可以有任意数量。

我需要提取所有 [aaaa|yyyy|zzz].categories.analysis值。也就是说,我需要以 Dictionary<string, string> 结束。 object 名称(例如 AbbbbAcccc 等)和 ID,忽略 name字符串。

例如, [阿布布,9001] [Acccc, 9001] [添加, 9001] ... [Zaaaa, 9001]

我从事此工作的时间太长了,感觉好像遗漏了一些明显的东西。我试过 JSON.net 和 native 序列化。对于我使用过的所有其他语言,这是一项微不足道的任务。

我已经接近这样的事情了:

var ajsonObject = JsonConvert.DeserializeObject<dynamic>(jsonString);
var oasearch_categories = ajsonObject.aaaa.categories.analysis;

但是,aaaa可以是任何字符串,所以我不确定如何动态引用它。

最佳答案

花了一段时间,但我想通了。我的要求与原来的问题略有不同......我的最终结果需要一个列表字典,所以我最终会得到一个像这样的字典:

DICT[ {"9001", ["Abbbb", "Acccc", "Adddd", ...]}, {"9002", ["Zbbbb, Zdddd", ...]}, etc. ]
      | key |  |          value               |   | key |  |       value       |

这是结果:

Dictionary<string, List<string>> idsAndTheirNames = new Dictionary<string, List<string>>();

try
{
    var ajsonObject = JsonConvert.DeserializeObject<dynamic>(JSONstring);

    foreach (var child in ajsonObject.Children())
    {
        foreach (var product in child.Children())
        {
            var categories = product.categories.analysis;

            foreach (var category in categories.Children())
            {
                foreach (var subcat in category)
                {
                    List<string> name = idsAndTheirNames[(string)subcat.id]; //e.g., "9001"

                    if (name == null) name = new List<string>();

                    name.Add(category.Name); //e.g., "Abbbb"
                    idsAndTheirNames[(string)subcat.id] = name; //"9001" -> ["Abbbb", "Acccc", etc.]

                    System.Diagnostics.Debug.WriteLine((string)category.Name);  //"Abbbb"
                    System.Diagnostics.Debug.WriteLine((string)subcat.name);    //"Chapter B"
                    System.Diagnostics.Debug.WriteLine((string)subcat.id);      //"9001"
                }
            }
        }
    }
}
catch (Exception ex)
{
    System.Diagnostics.Debug.WriteLine("JSON ERROR: " + ex.Message);
}

关于c# - 在 C# 中反序列化动态命名的 JSON 对象(使用 JSON.Net 或其他方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15227208/

相关文章:

c# - 通过反射获取XmlRootAttribute.ElementName

C# 泛型方法解析失败,出现不明确的调用错误

c# - 二维程序世界生成的动态多维数组

c# - 验证 C# WinForms 代码在 Visual Studio 2008 中工作的正确方法是什么?

ios - 如何在 swift 4 中使用 json 对象发送 json 数据

c# - Jetbrains Rider在Visual Studio调试器中是否有类似View反汇编代码的功能

.net - ClickOnce 部署 - 在启动时运行

c# - .NET 4.7.1 项目无法使用 .NET Core 2.0 库

xml - WCF 4.0 Rest 服务设置内容类型

python - 格式化tornado.access 的默认Python 日志记录