Unity Newtonsoft.Json将int默认值序列化为字符串

k4aesqcs  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(118)

当我序列化任何内部有int字段的类时,当它的值为0时,它将其序列化为string而不是int。
我有课:

[Serializable]
public class ResourceData
{
  public int Amount;
  public string Key;
}

当我使用Newtonsoft.Json将其序列化为json字符串时,

jsonSettings = new JsonSerializerSettings
{
  DefaultValueHandling = DefaultValueHandling.Include, 
};

var resourceData = new ResourceData();
string jsonString = JsonConvert.SerializeObject(resourceData, jsonSettings);

jsonString看起来像这样:

{
  "Amount": "0", // Instead of {"Amount": 0} I got {"Amount": "0"}. String instead of int
  "Key": ""
}

但它只发生在int值为零的情况下,如果它是除零之外的任何值,它将正确序列化。举例来说:

jsonSettings = new JsonSerializerSettings
{
  DefaultValueHandling = DefaultValueHandling.Include, 
};

var resourceData = new ResourceData();
resourceData.Amount = 5;
string jsonString = JsonConvert.SerializeObject(resourceData, jsonSettings);

// jsonString contains:
{
  "Amount": 5,
  "Key": ""
}

我需要Amount总是序列化为int,而不是string。
先谢谢你了。

yh2wf1be

yh2wf1be1#

你得到了一个奇怪的结果,这是不可能的。当我测试你的代码时,

{"Amount":0,"Key":null}

Newtonsoft文档:“DefaultValueHandling.Include -包括成员值与序列化对象时成员的默认值相同的成员。包含的成员被写入JSON。没有任何效果。”
它与更改属性值无关,它只在序列化过程中包含或不包含整个属性INTO JSON STRING。
因此,如果您选择DefaultValueHandling.Ignore,

{}

对于第一种情况,

{"Amount":5}

for resourceData.Amount = 5;
为了让另一个选项有更稳定的结果,我高度推荐你在你的类中添加getter/setter

public class ResourceData
{
  public int Amount {get; set;}
  public string Key {get; set;}
}

相关问题