2015-12-04 90 views
0

我想準備一個JSON文件,類似這樣內容的屬性名稱:閱讀JSON與變化

{ 
    "result": { 
    "1357": { 
     "icon": "smiley-face", 
     "name": "happy" 
    }, 
    "success": true 
    } 
} 

下面的作品,但我有問題這個例子是,屬性名classid總是不同。如何在不知道屬性名稱的情況下反序列化classid

using System; 
using System.IO; 
using Newtonsoft.Json; 

public class ClassId 
{ 
    [JsonProperty("icon")] 
    public string Icon { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

public class Result 
{ 
    [JsonProperty("1357")] // this key is always different 
    public ClassId classid { get; set; } 

    [JsonProperty("success")] 
    public bool Success { get; set; } 
} 

public class Example 
{ 
    [JsonProperty("result")] 
    public Result Result { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var json = File.ReadAllText("test.json"); 
     var container = JsonConvert.DeserializeObject<Example>(json); 
     Console.WriteLine(container.Result.classid.Icon); 
    } 
} 
+0

什麼是ClassId? –

回答

0

您將無法使用JsonConvert.DeserializeObject;您可能需要創建一個JsonReader來實現此邏輯。

0

通常,當JSON中的鍵可以更改時,可以使用Dictionary<string, T>代替常規類來處理它。有關我的意思,請參閱this question。但是,這種方法在您的情況下不起作用,因爲您的結果中也包含一個布爾型success標誌,並且不會與Dictionary<string, ClassId>混用。因此,您需要使用JsonConverter對您的Result類進行反序列化。這裏是你需要的代碼:

class ResultConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Result); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject obj = JObject.Load(reader); 
     Result result = new Result(); 
     result.Success = (bool)obj["success"]; 
     JProperty prop = obj.Properties().FirstOrDefault(p => p.Name != "success"); 
     if (prop != null) 
     { 
      result.classid = prop.Value.ToObject<ClassId>(serializer); 
     } 
     return result; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

要使用它,一個[JsonConverter]屬性添加到您的Result類是這樣的:

[JsonConverter(typeof(ResultConverter))] 
public class Result 
{ 
    ... 
} 

小提琴:https://dotnetfiddle.net/ACR5Un

0

你必須創建一個更多的類別名稱應該是您的鍵值,並且屬性圖標和名稱 將在該類中聲明並更改classid名稱,並顯示結果它將起作用