确定单个成员以序列化Json.NET中的整个类

时间:2019-09-12 22:31:51

标签: asp.net serialization json.net

我想创建一个将序列化为其成员之一的类。

采用一个在字符串和函数之间切换的帮助器类:

class YourSampler(torch.utils.data.sampler.Sampler):
    def __init__(self, mask, data_source):
        self.mask = mask
        self.data_source = data_source

    def __iter__(self):
        return iter([i.item() for i in torch.nonzero(mask)])

    def __len__(self):
        return len(self.data_source)

mnist = datasets.MNIST(root=dataroot, train=True, download=True, transform = transform)    
mask = [1 if mnist[i][1] == 5 else 0 for i in range(len(mnist))]
mask = torch.tensor(mask)   
sampler = YourSampler(mask, mnist)
trainloader = torch.utils.data.DataLoader(mnist, batch_size=batch_size,sampler = sampler, shuffle=False, num_workers=workers)

我不想输出using Newtonsoft.Json; class FunctionOrString { object JSONObject { get { return (((object)ValFunction) ?? ValString); } } public string ValString { get; set; } public Newtonsoft.Json.Linq.JRaw ValFunction { get; set; } } class ClassToSerialize { [JsonProperty("template")] public FunctionOrString Template { get; set; } } ,而是输出{ "template": { "JSONObject": "val" } }。我需要将哪些属性应用于{ "template": "val" }类或FunctionOrString属性,以便JSONObject对象将自身序列化为Template属性的序列化?

1 个答案:

答案 0 :(得分:1)

您将需要使用自定义JsonConverter来更改序列化JSON的形状。这样的事情应该可以完成工作:

class FunctionOrStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(FunctionOrString);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, ((FunctionOrString)value).JSONObject);
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

要使用它,您可以像这样向您的班级添加[JsonConverter]属性:

[JsonConverter(typeof(FunctionOrStringConverter))]
class FunctionOrString
{
    ...
}

这是一个有效的演示:https://dotnetfiddle.net/oIkhXg

注意:在您的问题中,JSONObject属性未标记为public。我认为这是一个偶然的遗漏。否则,您将需要使其internal或使用反射在转换器中获取其值。