这是我的代码:
void Main()
{
var test = new Order()
{
Id = Guid.NewGuid(),
Title = "Test",
Code = new Code("O-123456789") // TODO create a Code.NewCode() later
};
var line = Newtonsoft.Json.JsonConvert.SerializeObject(test).ToString();
Console.WriteLine(line);
}
// Define other methods and classes here
public class Order
{
public Guid Id { get; set; }
public Code Code { get; set; }
public string Title { get; set; }
}
public class Code
{
public string code;
public Code(string code)
{
this.code = code;
}
}
在控制台上我得到了这个结果:
{"Id":"227599fe-c834-4330-84e5-2018abe59e35","Code":{"code":"O-123456789"},"Title":"Test"}
但我想要这个:
{"Id":"227599fe-c834-4330-84e5-2018abe59e35","Code":"O-123456789","Title":"Test"}
那么如何强制我的代码类型按我想要的顺序化。实际上,我想要Guid()的相同行为。或者找到一种实现String()的方法。你能帮帮我吗?
我知道我可能会使用某些属性来强制JSON序列化,但我想要一些适用于所有序列化的东西,就像Guid()
一样答案 0 :(得分:1)
您可以创建一个新的JsonConverter
来处理您的类型,然后按照您喜欢的方式对其进行序列化:
public class CodeSerializer : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var code = value as Code;
writer.WriteValue(code.code);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return typeof(Code).IsAssignableFrom(objectType);
}
}
完成此操作后,您可以通过在SerializeObject
上设置一些属性将其插入JsonSerializerSettings
方法:
var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Converters.Insert(0, new CodeSerializer());
var line = Newtonsoft.Json.JsonConvert.SerializeObject(test, jsonSerializerSettings).ToString();
Console.WriteLine(line);
// {"Id":"2010e737-a9e8-4b77-bde6-1c50e92c6a30","Code":"O-123456789","Title":"Test"}
答案 1 :(得分:0)
也许你可以这样做;
public class Order
{
public Guid Id { get; set; }
[JsonIgnore]
public Code Code { get; set; }
public string SerializedCode
{
get
{
if (Code != null)
{
return Code.code;
}
return string.Empty;
}
}
public string Title { get; set; }
}
Output : {"Id":"227599fe-c834-4330-84e5-2018abe59e35","SerializedCode":"O-123456789","Title":"Test"}
实际上,您无法对所有序列化操作执行此操作。没有通用的方法来执行它。也许你可以提供自己的序列化器类。但我认为,这不是一个好的解决方案。您不希望序列化输出和类对象 彼此不同。这可能会引起另一个问题。我建议你改变你的类和属性来执行它。
答案 2 :(得分:0)
答案是David Watts在评论中给出的答案:
Json.Net将Guid的.Net Primitive转换为字符串(JSON Primitive)。有关newtonsoft.com/json/help/html/SerializationGuide.htm
的所有详细信息在较高的层次上,Json.NET序列化程序会将原始.NET值转换为原始JSON值,将.NET数组和集合转换为JSON数组,并将其他所有内容转换为JSON对象。
对于其他自定义序列化,我必须使用Kevin Smith解释的JsonConverter。