C# JsonSerializer.Serialize返回空对象

sdnqo3pr  于 2023-02-06  发布在  C#
关注(0)|答案(2)|浏览(354)

我遇到了一个关于将结构序列化为JSON的问题。因此,我有一个结构“Coordinates”

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]);

有人能给我解释一下吗--为什么会这样,如何正确地序列化?

bcs8qyzn

bcs8qyzn1#

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}";
    }
}

也来自文档:
序列化行为:
...

  • 当前,字段已排除。
    • 统一采购司**

由于. NET 5字段可以通过JsonSerializerOptions.IncludeFields全局设置或通过JsonIncludeAttribute包含。

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;
    }
    [JsonInclude]
    public string key;
    [JsonInclude]
    public string x;
    [JsonInclude]
    public string y;
    [JsonInclude]
    public string z;

    public override string ToString()
    {
        return $"{key} {this.x} {this.y} {this.z}";
    }
}
bihw5rsg

bihw5rsg2#

JsonSerializer是微软最近推出的一个相当新的库,它确实缺少一些特性,如字段序列化。
一种选择是将字段转换为属性,这是一个很好的建议,因为使用公共字段并不是一个好的设计实践,因为这会暴露对象的内部状态。但是,如果这是无法避免的,那么就选择一个复杂的JsonSerializer,如Newtonsoft.Json,它可以作为Nuget包提供。
Newtonsoft.Json
它可以按如下方式使用:

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

相关问题