JSON.NET Case Insensitive反序列化不起作用

时间:2017-08-20 12:27:11

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

我需要将一些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有Action& Data为小写,并且MyRootNode具有正确的大小。

我使用它来反序列化:

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

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

有什么想法吗?

编辑:添加了JSON

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

3 个答案:

答案 0 :(得分:6)

这是.NET Core内置JSON库。

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

    using System.Text.Json;

。 。

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

答案 1 :(得分:2)

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

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的建议。

答案 2 :(得分:1)

只需添加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建议