servicestack,C#,Json,Serialization,servicestack" /> servicestack,C#,Json,Serialization,servicestack" />

C# 使用ServiceStack';s JsonSerializer来序列化包含一些空项的数组

C# 使用ServiceStack';s JsonSerializer来序列化包含一些空项的数组,c#,json,serialization,servicestack,C#,Json,Serialization,servicestack,在ServiceStack 3.9中,当反序列化包含一些空值的JSON数组时,空值被反序列化为空值,正如我所期望的那样。然而,当我再次将同一数组序列化回JSON时,空值将变成空对象 public class MyClass { public string Foo { get; set; } } [Fact] public void Test() { var originalJson = "[{\"Foo\":\"Bar\"},null]";

在ServiceStack 3.9中,当反序列化包含一些空值的JSON数组时,空值被反序列化为空值,正如我所期望的那样。然而,当我再次将同一数组序列化回JSON时,空值将变成空对象

public class MyClass
{
    public string Foo { get; set; }
}


    [Fact]
    public void Test()
    {
        var originalJson = "[{\"Foo\":\"Bar\"},null]";

        var arr = ServiceStack.Text.JsonSerializer.DeserializeFromString<MyClass[]>(originalJson);

        var result = ServiceStack.Text.JsonSerializer.SerializeToString(arr);
        // output is actually: [{"Foo":"Bar"},{}]

        Assert.Equal(originalJson, result); // fails
    }
公共类MyClass
{
公共字符串Foo{get;set;}
}
[事实]
公开无效测试()
{
var originalJson=“[{\“Foo\”:\“Bar\”},null]”;
var arr=ServiceStack.Text.JsonSerializer.DeserializeFromString(originalJson);
var result=ServiceStack.Text.JsonSerializer.SerializeToString(arr);
//输出实际上是:[{“Foo”:“Bar”},{}]
Assert.Equal(originalJson,result);//失败
}
这是预期的行为吗?或者有没有其他方法可以序列化包含一些null的数组,并使null项在JSON中显示为null而不是空对象


请注意,当序列化文本数组(如字符串)时,空值作为空值返回,而不是作为对象返回。

我也遇到了这个问题。我发现,如果在调用
SerializeToString()
之前将数组强制转换为
object[]
,那么
null
值将按预期输出

var result = ServiceStack.Text.JsonSerializer.SerializeToString((object[])arr);
// result is correct [{"Foo":"Bar"}, null]
您可以使用此
JsConfig
全局设置
MyClass
的序列化:

JsConfig<MyClass[]>.RawSerializeFn = (obj) => ((object[])obj).ToJson();
JsConfig.fn=(obj)=>((object[])obj.ToJson();