如何将C#(dto)类转换为包含null、空值和缺失字段的JSON对象[已关闭]

332nm8kg  于 2023-03-04  发布在  C#
关注(0)|答案(2)|浏览(193)
    • 已关闭**。此问题为opinion-based。当前不接受答案。
    • 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

4天前关闭。
Improve this question
我想创建以下json消息:
1.{a:"foo",b:"bar "}
1.{a:"",b:"条"}
1.{a:空,b:"条"}
1.{b:"酒吧"}
C#解决方案应

  • 使用一个C#dto类
  • 使用众所周知的json序列化器/反序列化器库
  • 不使用属性。
piwo6bdm

piwo6bdm1#

你可以试试这个代码

using Newtonsoft.Json;

AbDto abDto = new AbDto {a="Foo", b="Bar"};

var case1=JsonConvert.SerializeObject(abDto); // {"a":"Foo","b":"Bar"}

abDto.a="";
 var case2=JsonConvert.SerializeObject(abDto); // {"a":"","b":"Bar"}

abDto.a=null;
var case3=JsonConvert.SerializeObject(abDto); // {"a":null,"b":"Bar"}

JObject abDtoJobj=JObject.FromObject(abDto);
abDtoJobj.Remove("a");
var case4=JsonConvert.SerializeObject(abDtoJobj); // {"b":"Bar"}
//or 
//var case4=abDtoJobj.ToString();

DTO

public class AbDto
{
    public string a { get; set; }
    public string b { get; set; }
}

更新
如果您改变了主意,不想使用c# DTO,那么这将非常容易,因为您不需要任何自定义类

JObject ab = new JObject { ["a"] = "Foo", ["b"] = "Bar" };

    var case1 = ab.ToString(); // {"a":"Foo","b":"Bar"}

    ab["a"] = "";
    var case2 = ab.ToString(); // {"a":"","b":"Bar"}

    ab["a"] = null;
    var case3 = ab.ToString(); // {"a":null,"b":"Bar"}

    ab.Remove("a");
    var case4 = ab.ToString(); // {"b":"Bar"}

创建JSON字符串的另一种流行方法是使用匿名对象,您也不需要任何自定义类

var ab = new  { a = "Foo", b = "Bar" };

    var case1 = JsonConvert.SerializeObject(ab); // {"a":"Foo","b":"Bar"}

    ab = new  { a = "", b = "Bar" };
    var case2 = JsonConvert.SerializeObject(ab); // {"a":"","b":"Bar"}

  // ... and so on
zwghvu4y

zwghvu4y2#

using System;
using System.Text.Json;
using System.Text.Json.Serialization;
                    
public class Program
{
    public class MyJsonDocument
    {
        public string? a { get; set; }
        public string? b { get; set; }
    }
    
    public static void Main()
    {
        Console.WriteLine(JsonSerializer.Serialize(new MyJsonDocument { a = "foo", b = "bar" }));
        Console.WriteLine(JsonSerializer.Serialize(new MyJsonDocument { a = string.Empty, b = "bar" }));
        Console.WriteLine(JsonSerializer.Serialize(new MyJsonDocument()));
        Console.WriteLine(JsonSerializer.Serialize(new MyJsonDocument { b = "bar" }, new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }));
    }
}

生产:

{"a":"foo","b":"bar"}
{"a":"","b":"bar"}
{"a":null,"b":null}
{"b":"bar"}

要么在文档上显示null,要么跳过它们。当重新加载文档时,解析器不会设置缺失的值,而是将它们作为类的构造函数的默认值。

相关问题