在 JSON 文件中保存和加载可为空的字符串

Posted

技术标签:

【中文标题】在 JSON 文件中保存和加载可为空的字符串【英文标题】:save and load nullable strings in JSON files 【发布时间】:2018-08-23 09:55:58 【问题描述】:

对于我的 Unity 游戏,我创建了一个包含 speedrun 时间的 JSON 文件。保存的时间是时间跨度字符串。加载数据时,我将字符串解析为 Timespan 值。保存时间时,我将时间跨度作为字符串保存到文件中。

JSON 文件中的示例级别:


  "id": 1,
  "personalBest": "00:00:00.0001336",
  "perfectTime": "00:00:00.0001335",

如果一个级别还没有通过,我希望personalBest 属性的值是null 而不是这样的

00:00:00.0000000

99:99:99.9999999

在我的可序列化类中,我目前有此代码

[Serializable]
public class Level

    public int id;
    public string? personalBest; // this value could be null
    public string perfectTime;

但我得到了这个错误

CS0453 类型“字符串”必须是不可为空的类型才能使用 它作为泛型类型或方法'System.Nullable'中的参数T

是否有解决办法?

【问题讨论】:

你应该看看this question上的brandonscript答案,它解释了很多。 应该关闭这个问题吗? 是的,它是重复的。请注意,您可能应该重新考虑保存内容的方式,您可以通过使personalBest 从包含 id 和时间的外部列表中获取值来避免将其保存为 null 【参考方案1】:

所以在 C# 中string 已经是一个可为空的类型。使用普通的string 代替string? 应该没问题。这意味着您可以通过执行以下操作将其设置为 null:

string myString = null;

如果我完全误解了你的问题,请告诉我。

为了在 JSON 中保存 null,check here

【讨论】:

【参考方案2】:

关于string 类型需要理解的重要一点是:

string 是一个引用类型,因此可以为空,并且当 string 字段 已声明但未初始化,它将其值设置为 "" 和 不是null

即:

public string myString;
if (myString != null) 
    Debug.Log("String is not null");

将在控制台中打印String is not null

这就是让一些人失望的原因,因为通常引用类型在声明但尚未初始化时默认设置为null

但是,如果您使用自动属性而不是字段来声明变量,那么它将表现为任何其他引用类型,即默认情况下为 null

public string myString get;set;
if (myString == null) 
    Debug.Log("String is null");

将在控制台中打印String is null

【讨论】:

以上是关于在 JSON 文件中保存和加载可为空的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串解析为可为空的 int

拆分字符串并转换为可为空的 long

在 Typescript 中将可为空的对象值转换为字符串

在表达式树中使用可为空的类型

Pyspark 可为空的 uuid 类型 uuid 但表达式的类型为字符变化

如何使用 System.Text.Json 处理可为空的引用类型?