将复杂的 json 反序列化为类似字典的结构

deserialize complex json into dictionary like structure

嗨,我有一个 json 文件。我可以修改。但我需要通过它的名字访问。 我需要像这样访问它

var result = sitelang.brands["en"] ;      // or
var result = sitelang.["brands"]["en"] ; 

我让它可以理解了吗?我对错误感到抱歉。
比你提前。
还有祝你好运!!与您的项目。

EDİT 真实 json 文件

{
"Brands": [
{
  "en": "Brands",
  "tr": "Markalar",
  "de": "Marken",
  "bg": "Производител",
  "el": "μάρκες",
  "uk": "бренди",
  "nl": "Merken",
  }
],
"Products": [
{
  "en": "Products",
  "tr": "Ürünler",
  "de": "Produkte",
  "bg": "Продукти",
  "el": "προϊόντα",
  "uk": "продукти",
  "nl": "producten",
  }
   ],
 "Search_Results": [
  {
  "en": "Arama Sonuçları",
  "tr": "Search Results",
  "de": "Suchergebnisse",
  "bg": "Резултати от търсенето",
  "el": "Αποτελέσματα Αναζήτησης",
  "uk": "Результати пошуку",
  }
 ],
}

如果你可以修改 JSON,这就是你想要的强类型语言 C# :

"Brands": [
  {
    "language" : "en",
    "translation" : "Brands"
  },
  {
    "language" : "de",
    "translation" : "Marken"
  },
  {
    "language" : "tr",
    "translation" : "Markalar"
  }
//etc
]

然后就可以根据语言动态访问了属性.

您可以为您的 JSON 创建 classes 的这种结构: class 站点语言 { public 列出品牌 { get;放; } public 列出产品 { get;放; } public 列表 Search_Results { 得到;放; } }

    class Language
    {
        public string en { get; set; }
        public string tr { get; set; }
        public string de { get; set; }
        public string bg { get; set; }
        public string el { get; set; }
        public string uk { get; set; }
        public string nl { get; set; } 
    }

    class Brands : Language
    {
    }

    class Products : Language
    {
    }

    class Search_Results : Language
    {
    }

然后反序列化你的对象:

var str = @"{
'Brands': [
{
    'en': 'Brands',
    'tr': 'Markalar',
    'de': 'Marken',
    'bg': 'Производител',
    'el': 'μάρκες',
    'uk': 'бренди',
    'nl': 'Merken',
    'fr': 'Marques',
    'ru': 'Бренды',
    'it': 'Marchi',
    'es': 'Marcas',
    'ja': 'ブランド',
    'mk': 'производители',
    'pt': 'Marcas',
    'ar': 'العلامات التجارية'
    }
],
'Products': [
{
    'en': 'Products',
    'tr': 'Ürünler',
    'de': 'Produkte',
    'bg': 'Продукти',
    'el': 'προϊόντα',
    'uk': 'продукти',
    'nl': 'producten',
    'fr': 'Des produits',
    'ru': 'Продукты',
    'it': 'Prodotti',
    'es': 'Productos',
    'ja': '製品',
    'mk': 'производи',
    'pt': 'Produtos',
    'ar': 'المنتجات'
    }
    ],
    'Search_Results': [
    {
    'en': 'Arama Sonuçları',
    'tr': 'Search Results',
    'de': 'Suchergebnisse',
    'bg': 'Резултати от търсенето',
    'el': 'Αποτελέσματα Αναζήτησης',
    'uk': 'Результати пошуку',
    'nl': 'Zoekresultaten',
    'fr': 'Résultats de la recherche',
    'ru': 'результаты поиска',
    'it': 'Risultati di Ricerca',
    'es': 'Resultados de la búsqueda',
    'ja': '検索結果',
    'mk': 'Резултати од пребарувањето',
    'pt': 'Procurar Resultados',
    'ar': 'نتائج البحث'
    }
    ],
}";

var siteLang = JsonConvert.DeserializeObject<SiteLang>(str);

var s = siteLang.Brands.FirstOrDefault().en;

对于复杂的JSON结构,可以使用如下:-

using System.Web.Script.Serialization;

var jss = new JavaScriptSerializer();
var dict = jss.Deserialize<Dictionary<string,dynamic>>(jsonText);

Console.WriteLine(dict["Brands"]); /
Console.WriteLine(dict["Products"]); 

您可以使用 Json.NET 解析 JSON 而无需提前声明 类,然后使用 LINQ 将其转换为字典:

var root = (JObject) JsonConvert.DeserializeObject(json);
var brands = root["Brands"]
  .AsJEnumerable()
  .First()
  .AsJEnumerable()
  .Cast<JProperty>()
  .ToDictionary(j => j.Name, j => j.Value);

要查找特定品牌的翻译,只需使用字典即可​​:

var translatedName = brands["en"];

"Brands" 字符串替换为 "Product""Search_Results" 以创建其他两个词典。

从你的评论中我了解到你有很多翻译。在这种情况下,您可以创建字典字典:

var root = (JObject) JsonConvert.DeserializeObject(json);
var dictionary = root
  .AsJEnumerable()
  .Cast<JProperty>()
  .ToDictionary(
    j => j.Name,
    j => j.Value
      .AsJEnumerable()
      .First()
      .AsJEnumerable()
      .Cast<JProperty>()
      .ToDictionary(k => k.Name, k => k.Value)
  );

并得到这样的翻译名称:

var translatedName = dictionary["Brands"]["tr"];