Десериализовать строку Json в Enum C # - PullRequest
0 голосов
/ 31 мая 2019

Я пишу тест для пользовательской версии stringEnumConverter.Но мой тест продолжает бросать, когда я десериализую.Я искал через переполнение стека, но не смог найти, что я сделал не так.Ниже приведен пример того, что я делаю:

namespace ConsoleApp2
{
    [Flags]
    [JsonConverter(typeof(StringEnumConverter))]
    enum TestEnum
    {
        none = 0, 
        obj1 = 1,
        obj2 = 2
    }

    class Program
    {
        static void Main(string[] args)
        {
            var jsonString = "{none}";
            var deserializedObject = JsonConvert.DeserializeObject<TestEnum>(jsonString);
        }
    }
}

Исключение, которое я получаю в строке десериализации, - неожиданный маркер StartObject при синтаксическом анализе enum.

Я подозреваю, что это может быть из-за того, что я неправильно представляю строку json, я также попытался "{\"none\"}", "{\"TestEnum\":\"none\"}", "{TestEnum:none}", "{none}" and "none".

Ответы [ 2 ]

4 голосов
/ 31 мая 2019

{none} не является допустимым JSON, но 'none' является действительным!

Вам следует попробовать следующее:

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        var jsonString = "'none'";
        var deserializedObject = JsonConvert.DeserializeObject<TestEnum>(jsonString);
        Console.WriteLine(deserializedObject);
    }
}

ура!

0 голосов
/ 31 мая 2019

Если вы сериализуете TestEnum.none в JSON, результат будет "none".Строка совершенно корректна JSON.

Ваш JSON даже не действителен JSON: * Это объект, * содержащий ключ (но ключи должны заключаться в кавычкидвойные кавычки), * не имеет значения.(и ключ объекта должен иметь значение)

Итак ... попробуйте что-то вроде этого:

var jsonString = "\"none\"";
var deserializedObject = JsonConvert.DeserializeObject<TestEnum>(jsonString);

Но вам не нужно писать пользовательскийсериализатору.JSON.Net сделает это за вас.См.

.NET - JSON-сериализация перечисления в виде строки

Но если вы хотите десериализовать объект, содержащий ваше перечисление, вам нужно что-то вроде этого:

{
  "enumKey" : "none"
}

Что будет примерно таким в вашем тесте:

var jsonString = "{ \"enumKey\" : \"none\" }";
...