这似乎很简单,但我无法弄清楚如何去做。我使用外部api来获取JSON结果(使用Newtonsoft.JSON),问题是一个糟糕的设计,让我得到一个混合类型的数组,如下所示:
{"data":["Monday 13 january", {"id":"1234aa","name":"teamA"},{"id":"1234bb","name":"teamB"}, "Tuesday 14 january", {"id":"1234aa","name":"teamA"}]}
这将产生如下对象:
public class RootObject
{
public List<object> data { get; set; }
}
我想忽略这些日期字符串并将对象反序列化为类型化数组
public class RootObject
{
public List<Team> data { get; set; }
}
任何想法是如何实现这种行为的?
更新: 也许我不清楚它,但我不是在寻找一种在反序列化后进行soms转换的解决方案。我想要一些集成解决方案,例如使用JsonConverter。
答案 0 :(得分:2)
这可以使用自定义JsonConverter
。
假设您的课程设置如下:
public class RootObject
{
[JsonProperty("data")]
[JsonConverter(typeof(TeamListConverter))]
public List<Team> Teams { get; set; }
}
public class Team
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
然后您可以使用此JsonConverter
来处理JSON数组的反序列化。这将忽略数组中的所有普通字符串(日期),并且只尝试反序列化对象。
public class TeamListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<Team>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
List<Team> teams = new List<Team>();
foreach (JToken token in array.Children())
{
if (token.Type == JTokenType.Object)
{
teams.Add(token.ToObject<Team>());
}
}
return teams;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
这是演示程序:
public class Program
{
public static void Main(string[] args)
{
string json = @"
{
""data"":
[
""Monday 13 january"",
{
""id"":""1234aa"",
""name"":""teamA""
},
{
""id"":""1234bb"",
""name"":""teamB""
},
""Tuesday 14 january"",
{
""id"":""1234aa"",
""name"":""teamA""
}
]
}";
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
foreach (Team t in obj.Teams)
{
Console.WriteLine(t.Id + " - " + t.Name);
}
}
}
这是输出:
1234aa - teamA
1234bb - teamB
1234aa - teamA
这是你在找什么?
答案 1 :(得分:0)
当您序列化Object时,您可以配置要忽略的属性,是否愿意这样做。如果您已经这样做,那么您必须迭代列表List<Object> data
以查找Team
对象并将它们放在单独的列表中。