我已经使用https://quicktype.io为我的Json数据创建了一个类。但是,我并不真正理解为什么使用从json转换为json创建的辅助方法,并提供默认参数,它们每个都以不同的方式创建,作为类的静态方法,静态类和带静态方法的类
原因是因为一旦我从另一组json数据创建第二个类,代码就会因为静态类而失败,我想确保我正确地重构它们。同时了解当然的原因。
我想'转换器'永远不会改变我所有的json对象,所以我可以将它移动到一个单独的文件和Serialize到一个静态方法使用FromJson。但我想更多地了解一下如何做到这一点的原因以及更好的方法。
以下是代码:
public partial class StationDO
{
public string Active { get; set; }
//more fields here
}
public partial class StationDO
{
public static List<StationDO> FromJson(string json)
{
return JsonConvert.DeserializeObject<List<StationDO>>(json, Converter.Settings);
}
}
public static class Serialize
{
public static string ToJson(this List<StationDO> self)
{
return JsonConvert.SerializeObject(self, Converter.Settings);
}
}
public class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
};
}
如果我查看同一网站生成的Java代码,它只会将bean的所有内容放入单个类中,并且转换器
答案 0 :(得分:1)
您可以在StationDO
课程中拥有所有静态成员。在这种情况下,我建议将该类标记为已密封(public sealed class StationDO
),以防止某人从该类继承并使用继承类中的静态方法。
public class InheritedStationDO : StationDO { }
// ... somewhere else ...
InheritedStationDO.FromJson(jsonValue); // still returns List<StationDO> not List<InheritedStationDO> !!!
修改强>
仔细看后我觉得,整个成员的设计都不好。
1)没有必要只接受List<StationDO>
。
2)没有必要为每个类的(反)序列化定义特殊方法,你将拥有。您可以只使用一种序列化方法,也可以使用一种方法对所有类进行反序列化。
示例:强>
public class StationDO {
public string Active { get; set; }
}
public class AnotherDO {
public string Name { get; set; }
}
// and more *DO classes
// class need to be "static" because contains "extension methods"
public static class MySerializationHelper {
private static readonly JsonSerializerSettings serializationSettings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
};
// universal method for deserialization from json
// the generic type "T" represents the result type of deserialization
public static T FromJson<T>(string json) {
return JsonConvert.DeserializeObject<T>(json, serializationSettings);
}
// universal method for serialization to json
// this "this" keyword means, its "extension method"
public static string ToJson<T>(this T self) {
return JsonConvert.SerializeObject(self, serializationSettings);
}
}
<强>用法:强>
StationDO obj01 = GetSomeStation();
// returns json of one object
string json01A = obj01.ToJson(); // these two lines are equivalent
string json01B = MySerializationHelper.ToJson(obj01); // these two lines are equivalent
// returns new object deserialized from json in "json01" variable
StationDO clone01 = MySerializationHelper.FromJson<StationDO>(json01A);
StationDO obj02 = GetAnotherStation();
StationDO[] arr01 = new StationDO[] { obj01, obj02 };
// returns json of array with two objects
string json02A = arr01.ToJson(); // these two lines are equivalent
string json02B = MySerializationHelper.ToJson(arr01); // these two lines are equivalent
// returns new array with deserialized object from json in "json02" variable
StationdDO[] clone02 = MySerializationHelper.FromJson<StationdDO[]>(json02A);
AnotherDO obj03 = GetAnotherDO();
string json03A = obj03.ToJson(); // these two lines are equivalent
string json03B = MySerializationHelper.ToJson(obj03); // these two lines are equivalent
如您所见,泛型是如何避免每个类的代码重复的方式。
您可以(de)序列化所有类型的数组和集合或单个对象。不只是List<T>
。