【问题标题】:How to ignore an array item during deserialization of JSON string如何在 JSON 字符串反序列化期间忽略数组项
【发布时间】:2013-10-31 07:40:25
【问题描述】:

这似乎很简单,但我就是不知道该怎么做。我使用外部 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。

【问题讨论】:

    标签: .net json json.net


    【解决方案1】:

    这可以通过自定义 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
    

    这是你要找的吗?

    【讨论】:

    • 这正是我正在寻找的,谢谢!我昨天晚上想出了类似的东西,但我使用了 2 个转换器。你的看起来更好更干净。我今晚试一试,如果有效,请标记它。谢谢!
    【解决方案2】:

    当您序列化一个对象时,您可以配置要忽略的属性,如果愿意的话。如果您已经这样做了,那么您必须迭代列表 List&lt;Object&gt; data 以找到 Team 对象并将它们放在单独的列表中。

    【讨论】:

    • 我不关注,我的问题不是关于属性,而是关于忽略数组项。请添加一些示例代码,看看您的解决方案是否有帮助。
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 2017-09-07
    • 2013-08-17
    • 2015-09-04
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多