如何在反序列化JSON字符串期间忽略数组项

时间:2013-10-31 07:40:25

标签: .net json json.net

这似乎很简单,但我无法弄清楚如何去做。我使用外部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。

2 个答案:

答案 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对象并将它们放在单独的列表中。