#c# #serialization #json.net #datacontractserializer
#c# #сериализация #json.net #datacontractserializer сериализатор данных #datacontractserializer
Вопрос:
Я пытаюсь строго ввести строковое значение в сериализуемом классе, и у меня возникают проблемы с выяснением, как это сделать.
Ниже приведен пример, в котором SomeValue
на самом деле это просто строковое значение, но я пытаюсь ввести строгий тип, чтобы предотвратить ошибки путаницы / кодирования с другими полями в том же классе.
[JsonObject(MemberSerialization.OptIn)]
[DataContract]
public class SomeObject
{
[DataMember, JsonProperty("some_value")]
public WrappedString SomeValue { get; set; }
}
WrappedString
Класс будет выглядеть примерно так:
public class WrappedString
{
public readonly string Value;
public WrappedString(string value)
{
Value = value;
}
}
Любые мысли о том, как обернуть примитивный тип и аннотировать класс, который должен использовать конструктор для десериализации объекта?
Ответ №1:
Вы можете написать пользовательский JsonConverter
var json = @"{""SomeValue"":""x"",""SomeStringValue"":""y""}";
var obj = JsonConvert.DeserializeObject<SomeObject>(json);
public class MyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return new WrappedString((string)reader.Value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public class SomeObject
{
[JsonConverter(typeof(MyConverter))]
public WrappedString SomeValue { get; set; }
public string SomeStringValue { get; set; }
}
public class WrappedString
{
public readonly string Value;
public WrappedString(string value)
{
Value = value;
}
}