2015-07-02 110 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