System.Text.Json - JSON 值无法转换为 System.String。

5
我收到以下 json 并发送到 API。
{
     "Id":22,
     "UserId":22,
     "Payload":{
        "Field":"some payload value"
        ...more unknown field/values go here
     },
     "ContextTypeId":1,
     "EventTypeId":1,
     "SessionId":1
}

我想将它映射到以下内容:
  public class CreateTrackItem : IRequest<int>
    {  
        public int Id { get; set; }
        public int UserId { get; set; }

        public string Payload { get; set; }
        public int ContextTypeId { get; set; }
        public int SessionId { get; set; }
        public int EventTypeId { get; set; }
    }

当映射Payload属性失败时,无法将json映射为字符串,我只想要Payload成为json的字符串版本(将进入postgresjsonb字段)。

我正在使用.NET Core 3.0,并希望在切换到Newtonsoft之前尽可能使用内置的System.Text.Json


Payload 需要是一个具有 Field 属性的 class 对象。 "Payload": { "Field": "一些有效载荷值" } 这是一个复杂对象,不是一个字符串。 - Ryan Wilson
@RyanWilson 因为负载结构未知,除了它将是有效的JSON之外,无法构建一个类,这就是为什么属性被设置为字符串的原因,它将接受任何抛出的JSON。 - Zoinky
那么你要么需要编写自定义的 JSON Converter,要么尝试使用类型 JToken,请参见此帖子(https://dev59.com/sV0a5IYBdhLWcg3wvq8y)。 - Ryan Wilson
2个回答

10
如果您正在使用asp.net core 3.0(或者 .Net 6中的System.Text.Json),那么它具有内置的JSON支持。我已经使用了以下内容,它可以在不设置自定义输入处理程序的情况下工作。
//// using System.Text.Json;

[HttpPost]
public async Task<IActionResult> Index([FromBody] JsonElement body)
{

    string json = System.Text.Json.JsonSerializer.Serialize(body);
    return Ok();

}

0

在编程中,你可以使用 Object 类型替代 String 类型。或者如 Ryan 在上面的评论中提到的那样,使用 Newtonsoft 的 JToken 类型。

public object Payload { get; set; }

 public class CreateTrackItem : IRequest<int>
{  
    public int Id { get; set; }
    public int UserId { get; set; }

    public object Payload { get; set; }
    public int ContextTypeId { get; set; }
    public int SessionId { get; set; }
    public int EventTypeId { get; set; }
}

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