Перенос примитивного типа в сериализацию объектов C # json и контракт с данными

#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;
    }
}