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

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?

0
Nice Codes 13 Апр 2020 в 07:08

2 ответа

Лучший ответ

Попробуй это:

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""
}");
2
weichch 13 Апр 2020 в 09:07

Настройте 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)
    {
    }
}

Результат введите описание изображения здесь

0
Xueli Chen 14 Апр 2020 в 05:05