如何反序列化嵌套的 json 字符串?

How to deserialize a nested json string?

假设我有这个 类:

internal class Test
{
    public string value { get; set; }

    public Test(string value)
    {
        this.value = value;
    }
}

public class Response<T>
{
    private string errorMessage { get; }
    private T returnValue { get;  }

    public Response(string errorMessage, T returnValue)
    {
        this.errorMessage = errorMessage;
        this.returnValue = returnValue;
    }

    public bool HasError() { return errorMessage != ""; }

    public bool AssertEqualsReturnValue(object obj) { return returnValue.Equals(obj); }
        
}

我有这个主要功能:

string json = 
@"{
    ""errorMessage"": ""This is an error"",
    ""returnValue"": {
        ""value"": ""this is what returns""
    }
}
";

Response<Test> r = JsonSerializer.Deserialize<Response<Test>>(json); ;
Console.WriteLine(r.AssertEqualsReturnValue("this is what returns"));
Console.WriteLine(r.HasError());

我收到下一条错误消息:

System.InvalidOperationException: 'Each parameter in the deserialization constructor on type 'IntroSE.Kanban.Backend.Response`1[ConsoleApp1.Test]' must bind to an object property or field on deserialization. Each parameter name must match with a property or field on the object. The match can be case-insensitive.'

它不会反序列化,因为我需要以某种方式告诉 JsonSerializer 我在 returnValue 键中有一个 Test 对象。 我在网上看到了一些解决方案,但问题是它们都使用 JsonConverter,它在 .Net 6.0 中不再使用。

您已经定义了具有 private 可见性的 errorMessagereturnValue 属性。如果之后将它们更改为 public,则不会抛出异常。

请注意,JsonInclude 属性只能用于 non-public 属性 访问器,例如 private set;private get;

仅供参考 你可以在 VS

中做到这一点
  1. 复制json

    { "errorMessage": "这是一个错误", “返回值”:{ "value": "这就是 returns" } }

  2. 选择编辑<选择性粘贴>粘贴JSON为类

  3. 检查并与您的类

    进行比较