JSON静态属性序列化不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON静态属性序列化不起作用相关的知识,希望对你有一定的参考价值。

我知道为什么静态变量的序列化默认不起作用,但是this question的答案似乎表明它可以使用正确的属性。

我的班级看起来像这样:

[JsonObject(MemberSerialization.OptIn)]
public class c
{
    [JsonProperty]
    public static double x{ get; set; } = 70;
    [JsonProperty]
    public static double y{ get; set; } = 36;
    [JsonProperty]
    public static double z{ get; set; } = 12;
}

它通过进入JSON.net

StatePersister.SaveState(new c(), fileName);


public static void SaveState(Object o, string savePath, FileFormat? format = null)
{
    DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true };
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(o.GetType(), settings);
    using (var stream = File.Create(savePath))
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, "	"))
        {

            serializer.WriteObject(writer, o);
            writer.Flush();
        }
    }
}

我已尝试使用和不使用[JsonObject(MemberSerialization.OptIn)]属性,无论哪种方式,我得到一个只包含“{}”的文件

单步执行代码我知道对象正在实例化,并且正在使用正确的信息传递给正确的对象。

答案

您正在使用Json.Net属性,但您没有使用Json.Net序列化程序。 DataContractJsonSerializer是.Net Framework的一部分,而不是Json.Net,所以它不会尊重[JsonObject][JsonProperty]的属性。此外,DataContractJsonSerializer不支持序列化静态成员,即使您使用了正确的属性(分别为[DataContract][DataMember])。如果要序列化静态成员,则需要使用Json.Net的JsonSerializer

using (var stream = File.Create(savePath))
using (TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8))
using (JsonWriter jsonWriter = new JsonTextWriter(textWriter))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(jsonWriter, o);
}

小提琴:https://dotnetfiddle.net/lYzDEE

注意:如果你的JSON很小,你根本不需要流。您可以将代码简化为:

string json = JsonConvert.SerializeObject(o);
File.WriteAllText(savePath, json, Encoding.UTF8);

以上是关于JSON静态属性序列化不起作用的主要内容,如果未能解决你的问题,请参考以下文章

来自活动xml的片段中的findViewById属性不起作用[重复]

Spring Boot REST 服务:JSON 反序列化不起作用

UIDevice 属性在静态库中不起作用

.NET 6 的 System.Text.Json 源代码生成不起作用

modx - 当我在同上片段中使用“&documents =”参数时,分页不起作用

反序列化从 Json 继承的 ReactiveObject 的对象不起作用