【问题标题】:Serialize custom type to JSON将自定义类型序列化为 JSON
【发布时间】:2021-10-18 14:56:36
【问题描述】:
class Program
    {
        static void Main(string[] args)
        {
            JSONClass jsonClass = new JSONClass();
            JSONElement el = new JSONElement
            {
                A = 5,
                B = "test1"
            };
            JSONElement el2 = new JSONElement
            {
                A = 3,
                B = "test2"
            };
            jsonClass.JSONList.Add(el);
            jsonClass.JSONList.Add(el2);

            var output = JsonSerializer.Serialize<JSONClass>(jsonClass);
            Console.WriteLine(output);
        }
    }

    public class JSONClass
    {
        public List<JSONElement> JSONList = new List<JSONElement>();
    }

    public class JSONElement
    {
        public int A { get; set; }
        public string B { get; set; }
    }

此代码返回{},这意味着JsonSerializer.Serialize 未能完成它应该做的事情。我想这是因为它不够聪明,无法处理自定义类型。这是我的问题,怎么做。互联网上到处都是关于如何编写自定义转换器等的文章,但没有一篇提到自定义类型。

【问题讨论】:

  • “此代码返回 {},这意味着 JsonSerializer.Serialize 未能完成它应该做的事情” - 不,这意味着 JsonSerializer 没有完成您预期的它到。我非常怀疑这是因为您的代码在 properties 中有一个 field 和 JsonSerializer 交易。将您的 JSONList 字段更改为属性,我怀疑会没事的。
  • @JonSkeet 很不幸。但无论如何我都会把这个问题留在这里,几十个反对票不会吓到我。感谢您的帮助,但现在我需要弄清楚如何在不使用列表属性名称的情况下对其进行反序列化。但它的主题不同。

标签: c# json


【解决方案1】:

您的JSONList 成员是公共字段 - 而JsonSerializer 查找属性。

将JSONClass 的代码更改为:

public class JSONClass
{
    public List<JSONElement> JSONList { get; } = new List<JSONElement>();
}

那么输出是:

{"JSONList":[{"A":5,"B":"test1"},{"A":3,"B":"test2"}]}

这里要学到的更大的教训是不要假设错误出在您正在使用的库中。始终开始期望问题出在您自己的代码中。有时您会发现它确实存在于库或系统代码(或编译器等)中,但根据我的经验,这相对很少见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多