2015-09-28 48 views
1

我在反序列化以下JSON结构时遇到问题。每个节点都包含一个ID和多个带有值的语言代码。语言属性的数量不一致。但我需要这些值作为具有语言字段和值字段的对象列表。解析字段名称不一致的JSON字符串

 [{ 
      "id":"w_312457", 
      "eng":"deep-fat frying", 
      "ger":"Frittieren" 
     }, 
     { 
      "id":"w_312458", 
      "fre":"frying", 
      "ger":"braten (in Öl)" 
     }, 
     { 
      "id":"w_312477", 
      "ger":"perfekt gewürzte und abgestimmte Soße " 
     }] 

我尝试使用JsonPropertyName属性和我的ID值。但是对于lang节点,我不知道我可以指定什么名字。以下是我的CLR对象,

public class Word 
{ 
    public string Id { get; set; } // This is working 

    // What can I specify here. I need a list of objects each with a lang code and value. 
} 
+2

你有没有进入任何方法呢?听起来你想要一个List >,然后解析字典。 –

+1

我会试图稍微改变你的JSON的结构。所以定义可以在任何数组中:''id“:”w_313223“,”translations“:[{”lang“:”ger“,”value“:”perfektgewürzteund abgestimmteSoße“}]我的意思是?这样数组可以有'x'的数量的翻译 –

回答

2

方法1:

一种方法是简单地将所有的价值观和检查,如果存在的话。例如,这是一个包含所有语言值类:

public class Word 
{ 
    public string id { get; set; } 
    public string eng { get; set; } 
    public string ger { get; set; } 
    public string fre { get; set; } 
} 

,你会得到清单,例如:

var words = JsonConvert.DeserializeObject<List<Word>>(json); 

当然,这假定只有3种语言,更不会被添加(这永远不会发生!)

方法2:

this线所示,可以deseria丽泽到像这本字典对象的列表:

var words = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(json); 

,您可以访问所有键和值是这样的:

foreach (var word in words) 
{ 
    foreach (var key in word.Keys) 
    { 
     Console.WriteLine($"value for the key {key} is {word[key]}"); 
    } 
} 

这将产生以下结果:

值密钥ID为w_312457

键值eng为深油炸

用于键GER

值为Frittieren

值的密钥ID是密钥FRE w_312458

值油炸

值的关键GER是braten(在醇)

对于密钥ID

值是关键蒙古包w_312477

值PERFEKTgewürzteUND abgestimmteSoße