как Json DeserializeObject указанный тип строки - PullRequest
0 голосов
/ 02 августа 2020

хорошо, я пытаюсь сериализовать объект и десериализовать его обратно, я использую эти классы для обработки получения различных типов

    public class JsonWrapper
{
    public string ObjType { get; set; }
    public object Obj { get; set; }
}
public class JsonWrapper<T>
{
    public string ObjType => typeof(T).FullName;
    public T Obj { get; set; }
}

это работает так

        var wrapper = new JsonWrapper<Car> {Obj = new Car {model = 2012, Color = "red"}};
        var serialized = JsonConvert.SerializeObject(wrapper);
        var deserialized = JsonConvert.DeserializeObject<JsonWrapper>(serialized);
        var type = Type.GetType(deserialized.ObjType);
        var message = JsonConvert.DeserializeObject(
            Convert.ToString(deserialized.Obj), type);

my Проблема в том, что, если я хочу использовать оболочку для строкового типа, если я попробовал таким же образом со строкой

        var wrapper = new JsonWrapper<string> {Obj = "hello"};
        var serialized = JsonConvert.SerializeObject(wrapper);
        var deserialized = JsonConvert.DeserializeObject<JsonWrapper>(serialized);
        var type = Type.GetType(deserialized.ObjType);
        var message = JsonConvert.DeserializeObject(
            Convert.ToString(deserialized.Obj), type);

, это не сработает и вы получите ошибку Unexpected character encountered while parsing value: h. Path '', line 1, position 1, работая с int, поэтому я интересно

1 Ответ

0 голосов
/ 02 августа 2020

Не обращая внимания на мое мнение о том, следует ли вам это делать или о полезности этого.

Учитывая

public class JsonWrapper<T>
{
   public string ObjType => typeof(T).FullName;
   public T Obj { get; set; }
}

Метод распаковки

public static object UnWrap(string json)
{
   var jObject = JObject.Parse(json);
   var objType = (string)jObject["ObjType"];

   if(string.IsNullOrWhiteSpace(objType)) 
      throw new InvalidOperationException("objType cannot be null or WhiteSpace");

   var type = Type.GetType(objType) ?? throw new ArgumentNullException("Type.GetType(objType)");

   var result = jObject["Obj"]?.ToObject(type) ?? throw new ArgumentNullException("jObject[\"Obj\"]?.ToObject(type)");

   return result;
}

Примечание: это была всего лишь быстрая попытка обеспечения отказоустойчивости, обработка, вероятно, должна быть лучше с более подходящим типом исключения. Использование

var wrapper = new JsonWrapper<string> { Obj = "hello" };
var serialized = JsonConvert.SerializeObject(wrapper);

var result = UnWrap(serialized);
Console.WriteLine(result.GetType().Name);

var wrapper2 = new JsonWrapper<Version> { Obj = new Version(1,2,3,4) };
var serialized2 = JsonConvert.SerializeObject(wrapper2);

result = UnWrap(serialized2);
Console.WriteLine(result.GetType().Name);

Выход

String
Version
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...