2017-02-05 3 views
1

Поэтому в основном у меня есть этот класс в C#, что я хочу, чтобы десериализации, Вот класс:Customized JSON.NET конвертер, который преобразует строку типа

public class Data { 
    public string Name{get;set;} 
    public string Label{get;set;} 
    public string Unit{get;set;} 
    public int Precision{get;set;} 

     [JsonPropertyAttribute("type")] 
     public Type DataType{get;set;} 
} 

И мой Json Строка выглядит следующим образом:

{ 
    "name": "ACCurrent", 
    "label": "ACCurrent", 
    "unit": "A", 
    "precision": 2, 
    "type": "float" 
} 

Но я не знаю, как написать собственный конвертер для преобразования «float» в typeof (float). Я видел документацию, и я думаю, что мне нужно работать над методом WriteJson под конвертером. Но я не совсем понимаю, как я должен это делать. Любая помощь будет оценена!

ответ

2

Мое предложение состоит в создании Custom Json Converter. Помните, что этот конвертер будет использоваться во время десериализации и времени сериализации. Я только реализовал десериализацию.

public class Data 
{ 
    public string Name { get; set; } 
    public string Label { get; set; } 
    public string Unit { get; set; } 
    public int Precision { get; set; } 

    [JsonPropertyAttribute("type")] 
    [JsonConverter(typeof(DataTypeConverter))] 
    public Type DataType { get; set; } 
} 

public class DataTypeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JToken token = JToken.Load(reader); 
     var value = token.Value<string>(); 
     if (value == "float") 
     { 
      return typeof (float); 
     } 
     return null; 

    } 

    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Некоторые испытания Код:

public static string GetJsonString() 
    { 
     return "{ \"name\": \"ACCurrent\", " + 
       " \"label\": \"ACCurrent\"," + 
       " \"unit\": \"A\"," + 
       " \"precision\": 2," + 
       " \"type\": \"float\" }"; 
    } 


    [Test] 
    public void Deserialize_String_To_Some_Data() 
    { 
     var obj = JsonConvert.DeserializeObject<Data>(RawStringProvider.GetJsonString()); 
     Assert.AreEqual(typeof(float), obj.DataType); 
    } 

Я пытался использовать Type.GetType ("someTypeString"), но это не будет работать. Type.GetType() thread.

Смежные вопросы