将复杂的json反序列化为字典,如结构

时间:2015-12-03 14:02:46

标签: c# json dictionary structure json-deserialization

你有一个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": "Результати пошуку",
  }
 ],
}

4 个答案:

答案 0 :(得分:1)

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

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

然后您可以根据语言属性动态访问它。

答案 1 :(得分:1)

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

headers

答案 2 :(得分:1)

您可以使用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"];

答案 3 :(得分:0)

您可以为JSON创建此类结构:         类SiteLang         {             public List Brands {get;组; }             公共列表产品{get;组; }             公共列表Search_Results {get;组; }         }

    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;
相关问题