【问题标题】:JSON.NET Case Insensitive Deserialization not workingJSON.NET 不区分大小写的反序列化不起作用
【发布时间】:2017-08-20 12:27:10
【问题描述】:

我需要将一些 JSON 反序列化到我的对象中,其中 JSON 的大小写未知/不一致。 JSON.NET 应该不区分大小写,但它对我不起作用。

我的班级定义:

public class MyRootNode
{
    public string Action {get;set;}
    public MyData Data {get;set;}
}

public class MyData
{
    public string Name {get;set;}
}

我收到的 JSON 包含小写的 ActionData,并且 MyRootNode 的大小写正确。

我正在使用它来反序列化:

MyRootNode ResponseObject = JsonConvert.DeserializeObject<MyRootnode>(JsonString);

它返回为初始化的MyRootNode,但ActionData 属性为空。

有什么想法吗?

编辑:添加 JSON

{
   "MyRootNode":{
      "action":"PACT",
      "myData":{
         "name":"jimmy"
      }
   }
}

【问题讨论】:

标签: c# .net json json.net deserialization


【解决方案1】:

这是 .NET Core 内置的 JSON 库。

我找到了另一种方法......以防万一,有人仍在寻找一种更清洁的方法。假设存在一个Movie

    using System.Text.Json;

。 . .

    var movies = await JsonSerializer.DeserializeAsync
        <IEnumerable<Movie>>(responseStream,
        new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        });

启动选项:

您也可以使用下面的扩展方法在应用程序启动时进行配置。

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddControllers()
            .AddJsonOptions(
                x =>
                {
                    x.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
                });
    }

【讨论】:

    【解决方案2】:

    只需添加JsonProperty属性并设置jsonProperty名称

    public class MyRootNode
    {
        [JsonProperty(PropertyName = "action")]
        public string Action {get;set;}
        [JsonProperty(PropertyName = "myData")]
        public MyData Data {get;set;}
    }
    
    public class MyData
    {
        [JsonProperty(PropertyName = "name")]
        public string Name {get;set;}
    }
    

    UPD:是的,按照@mjwills 的建议添加一些基本类型

    【讨论】:

    • 添加 JsonProperty 是硬编码所需的大小写。关键是提供 JSON 的人与他们的大小写不一致。有时它们是大写,然后是小写,然后是混合。我讨厌这个第三者。哈哈
    • 所以[JsonProperty(PropertyName = "myData")] 是这里的关键行@demo 吗?不错的发现顺便说一句!
    【解决方案3】:

    您需要添加一个额外的类:

    public class MyRootNodeWrapper
    {
        public MyRootNode MyRootNode {get;set;}
    }
    

    然后使用:

    MyRootNodeWrapperResponseObject = JsonConvert.DeserializeObject<MyRootNodeWrapper>(JsonString);
    

    https://stackoverflow.com/a/45384366/34092 可能值得一读。场景基本一样。

    另外,改变:

    public MyData Data {get;set;}
    

    到:

    public MyData MyData {get;set;}
    

    根据@demo 和@Guy 的建议。

    【讨论】:

    • 完美。谢谢。
    • @CathalMF 您还应该将Data 属性更改为MyDatapublic MyData MyData { get; set; }
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2012-02-22
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多