C# JsonSerializer.Serialize returns 一个空对象
C# JsonSerializer.Serialize returns an empty object
我遇到了将结构序列化为 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 序列化程序会 return 我 { "key": "v", "x": "0.12331212" ... },但它return只是一个空对象。
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]);
有人能给我解释一下吗?为什么会这样以及如何正确序列化?
目前 System.Text.Json
seems 不支持序列化字段。将字段更改为属性,一切正常:
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:
Serialization behavior:
...
- Currently, fields are excluded.
JsonSerializer 是微软最近推出的一个非常新的库。它确实缺少字段序列化等功能。
一个选项是将字段转换为属性,这是一个很好的建议,因为拥有 public 字段不是一个好的设计实践,因为您要公开对象的内部状态。
但是,如果这是无法避免的事情,那么请使用像 Newtonsoft.Json 这样复杂的 JsonSerializer,它可以作为 Nuget 包使用。
并且可以如图使用:
string json = JsonConvert.SerializeObject(parsedCoordinatesList[0], Formatting.Indented);
我遇到了将结构序列化为 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 序列化程序会 return 我 { "key": "v", "x": "0.12331212" ... },但它return只是一个空对象。
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]);
有人能给我解释一下吗?为什么会这样以及如何正确序列化?
目前 System.Text.Json
seems 不支持序列化字段。将字段更改为属性,一切正常:
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:
Serialization behavior:
...
- Currently, fields are excluded.
JsonSerializer 是微软最近推出的一个非常新的库。它确实缺少字段序列化等功能。
一个选项是将字段转换为属性,这是一个很好的建议,因为拥有 public 字段不是一个好的设计实践,因为您要公开对象的内部状态。 但是,如果这是无法避免的事情,那么请使用像 Newtonsoft.Json 这样复杂的 JsonSerializer,它可以作为 Nuget 包使用。
并且可以如图使用:
string json = JsonConvert.SerializeObject(parsedCoordinatesList[0], Formatting.Indented);