Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在JSON中使用未定义的特定值是一种不好的做法吗?_C#_Json_Asp.net Web Api - Fatal编程技术网

C# 在JSON中使用未定义的特定值是一种不好的做法吗?

C# 在JSON中使用未定义的特定值是一种不好的做法吗?,c#,json,asp.net-web-api,C#,Json,Asp.net Web Api,我有一个用C#编写的WebApi。在这个WebApi中,我将接收到的JSON转换为类。让我们成为这些课程中的一员。C1分别包含T1、T2和T3类型的属性P1、P2和P3 客户机必须发送一个PUT请求,该请求生成一个包含以下信息的JSON: 将P1的值更改为另一个值,但不为空 不对P2执行任何操作(保留当前值) 将P3设置为null C#类无法区分第二种和第三种情况,因为变量不存在“未定义”状态,因此我的问题是在不丢失这些信息的情况下将JSON序列化为C1 我所知道的大多数序列化程序都会采用以下策

我有一个用C#编写的WebApi。在这个WebApi中,我将接收到的JSON转换为类。让我们成为这些课程中的一员。C1分别包含T1、T2和T3类型的属性P1、P2和P3

客户机必须发送一个PUT请求,该请求生成一个包含以下信息的JSON:

  • 将P1的值更改为另一个值,但不为空
  • 不对P2执行任何操作(保留当前值)
  • 将P3设置为null
  • C#类无法区分第二种和第三种情况,因为变量不存在“未定义”状态,因此我的问题是在不丢失这些信息的情况下将JSON序列化为C1

    我所知道的大多数序列化程序都会采用以下策略:

    JSON中的null、缺失或未定义的值将导致相应类的属性中的null值

    以下是我的解决方案:

    • 我可以定义一个新类型,它包含实类型T1,并保存此信息,其中成员
      可选#IsDefined
      确定是否定义了它,而
      选项#Value
      在定义时检索实际值。当我收到JSON时,我遵循以下策略:
    如果JSON属性设置为未定义或不存在,则我将相应的C1属性设置为
    可选。不存在()
    ,如果JSON属性等于null,则我将C1属性设置为null

    • 我可以确定某些值意味着该值未定义。例如,如果T1是一个整数,我声明最大值表示该值未定义。当我希望服务器忽略这些值时,这样做需要一个JSON来保存特定的值。例如,如果我想忽略一个整数值,我必须将其设置为可能的最大整数值。使用此选项,我必须遵循以下策略:
    如果JSON属性被设置为一个特定的值,我认为这意味着未定义,我将该属性设置为数据库中已经存在的属性。如果属性为null,我将类的属性设置为null

    问题
    • 避免信息丢失的最佳策略是什么

    • 哪个选项更好(知道第一个选项意味着我的团队需要重新考虑成本)

    • 还有比我接触的更好的选择吗


    这是一个PUT,而不是补丁,因此传入对象是对象的新表示形式。另请参见。为什么不使用可空类型而不是编写包装器,因为我想区分可空类型和未定义类型