将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;} }
但是我怎样才能让class级为两者工作?
以下是基本课程:
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() : new Foo[] { token.ToObject() }; } }
在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(json1); Test test2 = JsonConvert.DeserializeObject (json2);
您将始终拥有一个数组,但第一个测试用例中将有1个元素,第二个测试用例中将有3个元素。
- 转到json2csharp.com
- 粘贴你的json数据
- 生成类
你去:)
using Newtonsoft.Json; using (WebClient wc = new WebClient()) { var json = wc.DownloadString(url); var t = JsonConvert.DeserializeObject(json); }