将字符串转换为“System.Text.Json.JsonElement”类型时出错。

5

我有一个类,其中有一些问题,需要从一个json文件中填充jsonElement,如下所示:

{
    "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"));

当我运行代码时,出现了一个错误,错误提示为“将值“This is my Layout”转换为类型'System.Text.Json.JsonElement'时出错。” 我该如何解决这个问题?
奇怪的是,在我的控制器端点上,我可以使用相同的输入。
public IActionResult Put([FromBody] Container container)

使用给定的 JSON 可以毫无问题地创建一个容器。那么为什么我使用反序列化器时它就不起作用了呢?


1
我认为UILUIV应该是字符串,而不是JsonElement - Selim Yildiz
我需要它成为一种可以通过字符串初始化的Json格式。 - howdoI
但是像“这是我的布局”这样的值只是字符串,而不是JSON对象。 - Selim Yildiz
@SelimYıldız 我有一个控制器端点,它接收这个 JSON 并将其反序列化到容器类中没有任何问题。但当我使用字符串触发它时似乎出现了问题。 - howdoI
我已经添加了回答,请检查。 - Selim Yildiz
2个回答

9

您需要使用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();
}

输出结果如下:

这是我的布局


请注意,我保留了HTML标记。

0

假设你的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是一个结构体,我不知道为什么你想要映射到这个结构体。

端点可能正常工作,因为它没有按照你的要求映射该属性。


我的控制器能够做到这一点 - 为什么我不能用反序列化程序做到这一点呢?@piraces - howdoI
@howdoI 我认为控制器没有映射这个属性... 你能检查一下吗? - piraces
确定它是正确的吗? - howdoI
Uill 的值是 "This is my Layout"?这很奇怪... 不过我认为你应该指定它是一个字符串。 - piraces
UIl 的 ValueKind = String: "This is my Layou2t",是的,我尝试了不同的字符串。 - howdoI
也许控制器反序列化是这样完成的,但反序列化程序以其他方式进行映射... 尽管如此,我认为将属性值更改为字符串是使它们都起作用的最佳方法,然后您就不必访问属性“ValueKind”来检索“uill”值。 - piraces

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接