当前位置: 首页 > 知识库问答 >
问题:

为什么我用JSON反序列化。NET忽略我的默认值?

孙阳旭
2023-03-14

我使用JSON. NET作为我的主要序列化程序。

这是我的模型,看,我已经设置了一些JSONProperties和一个DefaultValue。

public class AssignmentContentItem
{
    [JsonProperty("Id")]
    public string Id { get; set; }
    [JsonProperty("Qty")]
    [DefaultValue(1)]
    public int Quantity { get; set; }
}

当我序列化列表时

private static JsonSerializerSettings s = new JsonSerializerSettings
{
    DefaultValueHandling = DefaultValueHandling.Ignore,
    NullValueHandling = NullValueHandling.Ignore
};

输出:

[{"Id":"Q0"},{"Id":"Q4"},{"Id":"Q7"}]

但是当我想反序列化这个jsonContent时,属性Qty总是0并且没有设置为默认值。我的意思是,当我反序列化那个jsonContent时,因为DefaultValue for Quantity应该是1而不是0。

public static List<AssignmentContentItem> DeserializeAssignmentContent(string jsonContent)
{
    return JsonConvert.DeserializeObject<List<AssignmentContentItem>>(jsonContent, s);
}

我该怎么办


共有2个答案

羊舌兴德
2023-03-14

您可以使用DefaultValueHandling。填充设置,以便Json。Net将使用默认值填充创建的对象。

public static List<AssignmentContentItem> DeserializeAssignmentContent(string jsonContent)
{
    return JsonConvert.DeserializeObject<List<AssignmentContentItem>>(jsonContent, new JsonSerializerSettings
    { 
            DefaultValueHandling = DefaultValueHandling.Populate, 
            NullValueHandling = NullValueHandling.Ignore 
    });
}

http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm

莫河
2023-03-14

默认值属性不设置属性的值。请参阅此问题:。NET DefaultValue属性

最好是在构造函数中设置值:

public class AssignmentContentItem
{
    [JsonProperty("Id")]
    public string Id { get; set; }
    [JsonProperty("Qty")]
    public int Quantity { get; set; }

    public AssignmentContentItem()
    {
        this.Quantity = 1;
    }
}

其中此行:

AssignmentContentItem item =
    JsonConvert.DeserializeObject<AssignmentContentItem>("{\"Id\":\"Q0\"}");

导致分配内容项(AssignmentContentItem)及其数量(Quantity)设置为1(code)。

 类似资料:
  • 问题内容: 这是我的课 最初的一个实际上需要转换为良好的json数据。这是最初的坏人 这是我的json数据,我无法反序列化。即使更改,我仍会收到默认值 我的自定义封面 问题答案: 您可以使用json.net以显示的格式对a进行反序列化和重新序列化,只要您使用custom即可。这是必需的,因为默认情况下,对象集合在JSON数组之间进行序列化,但是在JSON中,对象集合以单个对象的紧凑形式进行序列化,

  • 问题内容: 这是从CruiseControl执行时得到的: 同时,从命令行启动它可以提供正确的结果。为什么要进入这个?为什么忽略了我?我该如何解决? 我不知道从CC启动when 的值是什么。我真的很想获得这些信息,但我不知道如何。CC本身是从用户开始与该用户给我(这是CentOS的5.4): 问题答案: 假设您有一台linux机器。 看一下,这是一个符号链接。查看此符号链接的目标位置(在我的情况下

  • 当反序列化各种JSON消息时,我希望为某种类型的属性提供默认值。通常建议简单地在类中指定值,但如果必须跨许多类这样做,这很容易出错。您可能会忘记一个值,并以而不是默认值结束。我的意图是将每个的属性设置为。由于正是试图消除的内容,因此将它们与Jackson一起使用是令人沮丧的。 Jackson允许您自定义反序列化过程的大多数特性都集中在作为输入的JSON上,而不是围绕实例化要反序列化到的对象的过程。

  • 见下图。我的.gitignore文件应该忽略src/dist中的所有文件,但事实并非如此。

  • 问题内容: 我有一个简单的接口与属性的getter和setter。 我还有另一个实现此接口的UserAccount类。 我的问题是我想序列化money属性,但在反序列化它时忽略它,即,不接受用户对此属性的任何值。我在setter上尝试过@JsonIgnore,在getter上尝试过@JsonIgnore(false),它确实会忽略它,但是在序列化它时也会这样做。 我在setter上尝试了@Json

  • 我有另一个类UserAccount实现了这个接口。 我的问题是,我想序列化money属性,但在反序列化时忽略它,即不接受用户对该属性的任何值。我在setter上尝试了@jsonIgnore,在getter上尝试了@jsonIgnore(false),它确实忽略了它,但是它在序列化它的同时也忽略了它。 我在setter上尝试了@jsonIgnore,在getter上尝试了@jsonProperty,