首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonSerializer.Deserialize失败

JsonSerializer.Deserialize失败
EN

Stack Overflow用户
提问于 2020-02-08 02:21:37
回答 4查看 29.2K关注 0票数 15

考虑一下密码..。

代码语言:javascript
复制
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到ReadOnlySpanUtf8JsonReader时遇到了困难。

我在搜索时发现了这个项目,这让我觉得它应该像我所期望的那样工作。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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);

所以你也需要这样做:

代码语言:javascript
复制
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所示

代码语言:javascript
复制
services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});

或者,您可以将[JsonPropertyName("id")]应用于您的模型:

代码语言:javascript
复制
public class User {
    [JsonPropertyName("id")]
    public int Id { get; set; }
}

演示小提琴#2 这里

票数 38
EN

Stack Overflow用户

发布于 2020-02-08 02:52:29

多亏了mr5通过聊天暗示这是个套管问题

将字符串更改为使用TitleCase ("Id")可以解决这个问题。

我正在提交一张罚单,其中一个可能相关的问题 评论带我到了另一个问题,这导致了文档,它有一个解决方案

代码语言:javascript
复制
var options = new JsonSerializerOptions();
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

利用这些选项解决问题..。

代码语言:javascript
复制
string str = "{\"id\": " + id + "}";
var options = new JsonSerializerOptions();
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
var u = JsonSerializer.Deserialize<User>(str, options);

把这些都忘了,以防对别人有帮助。

票数 3
EN

Stack Overflow用户

发布于 2021-03-07 09:17:32

您还可以阅读此MicrosoftDocumentsJSON序列化,对于配置,您可以使用以下内容:

代码语言:javascript
复制
JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);
var serialized = JsonSerializer.Serialize(data, _jsonOptions);
var deserialized = JsonSerializer.Deserialize<TEntity>(serialized , _jsonOptions);

JsonSerializerDefaults.Web它是一个预定义的枚举设置,如"camelCase值“、”不区分大小写的属性名称“等,请检查此JsonSerializerDefaults.?,如果您想要自定义,您将再次检查文档这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60123376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档