Ошибка преобразования строки в тип 'System.Text. Json .JsonElement - PullRequest
0 голосов
/ 19 марта 2020

У меня есть класс, в котором у меня есть некоторые проблемы с заполнением jsonElement из файла json как такового

{
    "entities": [
        {
            "name": "DateTimeENT1",
            "description": "This a  example",
            "uil": {
                      "uill": "This is my Layout"
            }
        }
    ]
}

, который десериализуется в этот класс:

public class Container {

    public ICollection<Entity> Entities {get; set;}
}


public class Entity {
    public string Name {get; set;}
    public string Descripton {get; set;}
    UIL Uil {get; set;}
}

public class UIL{
    JsonElement Uill {get; set;}
}

и вот как я его десериализовал:

var input= JsonConvert.DeserializeObject<Container>(File.ReadAllText(@"init.json"));

, когда я запускаю это, я получаю сообщение о том, что 'Error converting value "This is my Layout" to type 'System.Text.Json.JsonElement'. как мне преодолеть это?

Странная часть всего этого является то, что я могу использовать тот же вход на моей конечной точке контроллера

public IActionResult Put([FromBody] Container container)

, который без проблем создает контейнер с заданным json .. так почему он не работает, когда я делаю это с десериализатором

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Вам нужно использовать JsonDocument.Parse вместо JsonConverter.DeserializeObject.

static void Main(string[] args)
{
    var jsonInput= @"{
                        ""entities"": 
                        [
                            {
                                ""name"": ""DateTimeENT1"",
                                ""description"": ""This a  example"",
                                ""uil"": {
                                        ""uill"": ""This is my Layout""
                                }
                            }
                        ]
                    }";

    using (JsonDocument doc = JsonDocument.Parse(jsonInput))
    {
        JsonElement root = doc.RootElement;
        JsonElement entities = root.GetProperty("entities");
        //Assuming you have only 1 item, if you have more you can use EnumerateArray and MoveNext()..
        JsonElement uilItem = entities[0].GetProperty("uil");
        JsonElement uillItem = uilItem.GetProperty("uill");
        Console.WriteLine(uillItem.GetString());
    }
    Console.ReadLine();
}

Вывод будет:

Это мой макет

0 голосов
/ 19 марта 2020

Интерпретируя, что ваш JSON похож на тот, который вы опубликовали, вы должны изменить свой класс Entity и объявить свойство UIL в виде строки:

public class Container {

    public ICollection<Entity> Entities {get; set;}
}

public class Entity {
    public string Name {get; set;}
    public string Descripton {get; set;}
    UIL Uil {get; set;}
}

public class UIL {
    public string Uill {get; set;}
}

JsonElement является структурой , и я не знаю, почему вы можете захотеть отобразить эту структуру.

Возможно, конечная точка работает, потому что она не отображает это свойство так, как вам нужно.

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