考虑一下密码..。
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
int id = 9;
string str = "{\"id\": " + id + "}";
var u = JsonSerializer.Deserialize<User>(str);
Console.WriteLine($"User ID: {u.Id}, Correct: {id == u.Id}"); // always 0/init/default value
}
}
public class User {
public int Id { get; set; }
}为什么没有将数据正确地反序列化到User对象中?我还通过DotNetFiddle验证了这种行为,以防它是我的系统的本地问题。不抛出任何例外。
我的实际实现是从[ApiController]的[HttpPost]操作中读取的,它是通过_httpClient.PostAsync在MVC/Razor项目中调用的。当Created返回到PostAsync调用时,我验证了这些值是正确的,但是无论如何,从响应体解析的值只包含默认值(实际ID是Guid)。
我最初认为这可能是一个与UTF8相关的问题,因为这是StringContent i post到ApiController的编码。UTF8反序列化被引用为这里,但我在从HttpContent的IO.Stream到ReadOnlySpan或Utf8JsonReader时遇到了困难。
我在搜索时发现了这个项目,这让我觉得它应该像我所期望的那样工作。
发布于 2020-02-08 02:52:52
您的问题是,System.Text.Json在默认情况下是区分大小写的,因此"id": 9 (所有小写)没有映射到Id属性。来自文档
大小写不敏感属性匹配 默认情况下,反序列化查找JSON和目标对象属性之间区分大小写的属性名称匹配。若要更改此行为,请将
JsonSerializerOptions.PropertyNameCaseInsensitive设置为true: 注意: web默认 是不区分大小写的. var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true,};var weatherForecast = JsonSerializer.Deserialize(jsonString,options);
所以你也需要这样做:
var u = JsonSerializer.Deserialize<User>(str, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });演示小提琴#1 这里。
(如果差异完全是由于camel大小写,而不是一般情况下的差异,则可以将序列化程序配置为使用camel大小写,如这个答案 by t.j.所示。)
可以在ASP.NET Core3.0中配置启动时的选项,如https://stackoverflow.com/q/58392039/3744182所示
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});或者,您可以将[JsonPropertyName("id")]应用于您的模型:
public class User {
[JsonPropertyName("id")]
public int Id { get; set; }
}演示小提琴#2 这里。
发布于 2020-02-08 02:52:29
多亏了mr5和通过聊天暗示这是个套管问题。
将字符串更改为使用TitleCase ("Id")可以解决这个问题。
我正在提交一张罚单,其中一个可能相关的问题 评论带我到了另一个问题,这导致了文档,它有一个解决方案。
var options = new JsonSerializerOptions();
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;利用这些选项解决问题..。
string str = "{\"id\": " + id + "}";
var options = new JsonSerializerOptions();
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
var u = JsonSerializer.Deserialize<User>(str, options);把这些都忘了,以防对别人有帮助。
发布于 2021-03-07 09:17:32
您还可以阅读此MicrosoftDocumentsJSON序列化,对于配置,您可以使用以下内容:
JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);
var serialized = JsonSerializer.Serialize(data, _jsonOptions);
var deserialized = JsonSerializer.Deserialize<TEntity>(serialized , _jsonOptions);JsonSerializerDefaults.Web它是一个预定义的枚举设置,如"camelCase值“、”不区分大小写的属性名称“等,请检查此JsonSerializerDefaults.?,如果您想要自定义,您将再次检查文档这里。
https://stackoverflow.com/questions/60123376
复制相似问题