【问题标题】:C# JsonSerializer.Serialize returns an empty objectC# JsonSerializer.Serialize 返回一个空对象
【发布时间】:2020-10-24 07:51:11
【问题描述】:

我遇到了关于将结构序列化为 JSON 的问题。所以,我有一个结构“坐标”

namespace CoordinatesNameSpace
{
    public struct Coordinates
    {
        public Coordinates(string key, string x, string y, string z)
        {
            this.key = key;
            this.x = x;
            this.y = y;
            this.z = z;
        }
        public string key;
        public string x;
        public string y;
        public string z;
        public override string ToString()
        {
            return $"{key} {this.x} {this.y} {this.z}";
        }
    }
}

所有属性都是公共的,所以我希望 json 序列化程序会返回 { "key": "v", "x": "0.12331212" ... },但它只返回一个空对象。

using CoordinatesNameSpace;

namespace ObjToJSON
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Coordinates> parsedCoordinatesList = new List<Coordinates>();
            Coordinates _c;
            _c.key = splitted[0]; // "v"
            _c.x = splitted[1]; // "1.324394"
            _c.y = splitted[2]; // "-0.219625"
            _c.z = splitted[3]; // "-0.422554"
            parsedCoordinatesList.Add(_c);

            // returns an [{}, {}, {} ...]
            //string json = JsonSerializer.Serialize<List<Coordinates>>(parsedCoordinatesList);

            // returns {}
            string json = JsonSerializer.Serialize<Coordinates>(parsedCoordinatesList[0]);

有人可以向我解释一下吗?为什么会这样以及如何使其正确序列化?

【问题讨论】:

    标签: c# json jsonserializer


    【解决方案1】:

    seems 目前System.Text.Json 不支持序列化字段。将字段更改为属性,一切正常:

    public struct Coordinates
    {
        public Coordinates(string key, string x, string y, string z)
        {
            this.key = key;
            this.x = x;
            this.y = y;
            this.z = z;
        }
        public string key  { get; set; }
        public string x  { get; set; }
        public string y  { get; set; }
        public string z  { get; set; }
        public override string ToString()
        {
            return $"{key} {this.x} {this.y} {this.z}";
        }
    }
    

    同样来自docs

    序列化行为:

    ...

    • 目前,字段被排除在外。

    【讨论】:

      【解决方案2】:

      JsonSerializer 是微软最近推出的一个相当新的库。它确实缺少一些功能,例如字段序列化。

      一种选择是将字段转换为属性,这是一个很好的建议,因为拥有公共字段不是一个好的设计实践,因为您要公开对象的内部状态。 但是,如果这是无法避免的事情,那就选择一个复杂的 JsonSerializer,比如 Newtonsoft.Json,它可以作为 Nuget 包使用。

      Newtonsoft.Json

      而且可以如图所示使用:

      string json = JsonConvert.SerializeObject(parsedCoordinatesList[0], Formatting.Indented);
      

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 2020-02-19
        • 2021-03-31
        • 2014-07-15
        • 2018-08-25
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多