2015-07-02 109 views
4

我想反序列化我的json數據,但是我的類沒有正確設置我沒有訪問權限來更改json響應,所以我需要編寫一個函數來正確處理json。反序列化JSON單個字符串到陣列

下面是數據

{ 
    "blabla": { 
    "-Score": "1", 
    "-Ref": "50", 
    "foo": { 
     "-colour": "Yellow", 
     "-ref": "y50" 
    } 
    } 
} 

但有時數據會

{ 
    "blabla": { 
    "-Score": "1", 
    "-Ref": "50", 
    "foo": [ 
     { 
     "-colour": "Yellow", 
     "-ref": "y50" 
     }, 
     { 
     "-colour": "Green", 
     "-ref": "g50" 
     }, 
     { 
     "-colour": "Red", 
     "-ref": "r50" 
     } 
    ] 
    } 
} 

這個類的工作第一個數據

public class blabla 
{ 
    public Foo Foo {get; set;} 
} 

而且這類作品爲第二數據

public class blabla 
{ 
    public Foo[] Foo {get; set;} 
} 

但是我怎樣才能讓這個班同時工作?

+3

「爲了便於閱讀」,如果您顯示實際的JSON,它會更好。你問我們如何反序列化我們想象的*這兩個例子的JSON表示可能是。 –

+1

你對JSON格式有任何控制權嗎? 「有時它是一個數組,有時不是」並不是最有說服力的表現。 「總是一個數組,即使只有一個」會使序列化和反序列化兩方面的生活更輕鬆。 –

+0

我完全無法控制它不幸 – DaGeezah

回答

1

以下是一些基本類:

public class Test 
{ 
    public Blabla blabla { get; set; } 
} 

public class Blabla 
{ 
    public string _score { get; set; } 
    public string _ref { get; set; } 

    [JsonConverter(typeof(FooConverter))] 
    public Foo[] foo { get; set; } 
} 

public class Foo 
{ 
    public string _colour { get; set; } 
    public string _ref { get; set; } 
} 

foo的設置類型設置爲Foo[],無論數據是什麼,並添加[JsonConverter(typeof(FooConverter))]以使用自定義轉換器。

這裏是定製轉換器:

public class FooConverter : JsonConverter 
{ 
    // Declared as abstract in JsonConverter so must be overridden 
    public override bool CanConvert(Type objectType) { return true; } 

    // Declared as abstract in JsonConverter so must be overridden 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JToken token = JToken.Load(reader); 

     return token.Type == JToken.Array ? token.ToObject<Foo[]>() : new Foo[] { token.ToObject<Foo>() }; 
    } 
} 

ReadJson方法中,我們在令牌加載數據,我們檢查數據是否是一個數組或一個普通的對象。如果它已經是一個數組,我們只返回數組對象Foo[],如果它是一個普通的對象,我們返回一個包含我們的普通對象的new Foo[]

下面是測試情況:

string json1 = @"{ 
        ""blabla"": 
        { 
         ""_score"": ""1"", 
         ""_ref"": ""50"", 
         ""foo"": 
         { 
          ""_colour"": ""Yellow"", 
          ""_ref"": ""y50"" 
         } 
        } 
       }"; 

string json2 = @"{ 
       ""blabla"": 
        { 
         ""_score"": ""1"", 
         ""_ref"": ""50"", 
         ""foo"": 
         [ 
          { 
          ""_colour"": ""Yellow"", 
          ""_ref"": ""y50"" 
          }, 
          { 
          ""_colour"": ""Green"", 
          ""_ref"": ""g50"" 
          }, 
          { 
          ""_colour"": ""Red"", 
          ""_ref"": ""r50"" 
          } 
         ] 
        } 
       }"; 

Test test1 = JsonConvert.DeserializeObject<Test>(json1); 
Test test2 = JsonConvert.DeserializeObject<Test>(json2); 

你總是有一個數組但會有在第一測試例1個元件,和在所述第二測試例3層的元件。

1
  1. json2csharp.com
  2. 粘貼您的JSON數據
  3. 生成類

你去那裏:)

using Newtonsoft.Json; 
using (WebClient wc = new WebClient()) 
{ 
    var json = wc.DownloadString(url); 
    var t = JsonConvert.DeserializeObject<whateverClass.you.have.made>(json); 
} 
+0

謝謝,但不是 - 如果你粘貼第一個數據,它將它設置爲一個字符串,並且如果粘貼第二個數據,則將其作爲數組。 – DaGeezah

+0

檢查變量是否包含元素呢?某事如... if(t.response.foo.Count!= 0) – jamiii