我想创建一个将序列化为其成员之一的类。
采用一个在字符串和函数之间切换的帮助器类:
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
属性的序列化?
答案 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
或使用反射在转换器中获取其值。