Как сериализовать json строковое значение в класс в Newtonsoft Json - PullRequest
0 голосов
/ 13 апреля 2020

Если у меня есть следующий класс модели

public class User
{
    public string Name {get; set;}
    public string UUID {get; set;}
}

Следующая строка JSON будет преобразована правильно

// JSON 1
{
  "User": {
    "Name": "Hello World",
    "UUID": "000000-00000-00000"
  }
}

В моем случае иногда у меня есть следующее JSON JSON 2 что свойство User JSON представляет значение UUID вместо объекта пользовательской модели

// JSON 2
{
  "User": "000000-00000-00000"
}

Я хочу использовать класс User как ASP. Net Core модель параметров действия, а это значит, что мне может понадобиться пользовательский JsonConverter.

Можно ли как-то преобразовать приведенную выше строку JSON в User Class?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Попробуйте:

class UserJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(User);

    public override bool CanWrite => false;

    public override object ReadJson(JsonReader reader, Type objectType, 
        object existingValue, JsonSerializer serializer)
    {
        var token = JToken.ReadFrom(reader);
        if (token.Type == JTokenType.Null)
        {
            return null;
        }

        var user = new User();
        // Convert string
        if (token.Type == JTokenType.String)
        {
            user.UUID = token.Value<string>();
        }
        // Convert object
        else
        {
            serializer.Populate(token.CreateReader(), user);
        }

        return user;
    }

    public override void WriteJson(JsonWriter writer, object value,
        JsonSerializer serializer)
    {
    }
}

Это работает для:

[JsonConverter(typeof(UserJsonConverter))]
public class User
{
    public string Name { get; set; }
    public string UUID { get; set; }
}

var obj = JsonConvert.DeserializeObject<MyClass>(
@"{
  ""User"": {
    ""Name"": ""Hello World"",
    ""UUID"": ""000000-00000-00000""
  }
}");

var obj2 = JsonConvert.DeserializeObject<MyClass>(
@"{
  ""User"": ""000000-00000-00000""
}");
0 голосов
/ 14 апреля 2020

Настройте JsonConverter, как показано ниже:

public class UserJsonConverter:JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(User);

    public override bool CanWrite => false;

    public override object ReadJson(JsonReader reader, Type objectType,
        object existingValue, JsonSerializer serializer)
    {
        var token = JToken.ReadFrom(reader);
        if (token.Type == JTokenType.Null)
        {
            return null;
        }

        var user = new User();

        // Convert object
        if (token.SelectToken("User").HasValues)
        {
            user.Name = token.SelectToken("User.Name").ToString();
            user.UUID = token.SelectToken("User.UUID").ToString();
        }
        // Convert string
        else
        {
            user.UUID = token.SelectToken("User").ToString();
        }

        return user;
    }

    public override void WriteJson(JsonWriter writer, object value,
        JsonSerializer serializer)
    {
    }
}

Результат enter image description here

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