如何以json格式从类返回非空属性[重复]

Posted

技术标签:

【中文标题】如何以json格式从类返回非空属性[重复]【英文标题】:How to return non-null properties from a class in json format [duplicate] 【发布时间】:2019-09-12 12:15:36 【问题描述】:

我有一个有四个属性的类,最后两个可能为空。如果是,我不想在结果集中返回它们。

public class Foo

    public string prop1  get; set; 
    public string prop2  get; set; 
    public string prop3  get; set; 
    public string prop4  get; set; 

还有这个 Azure 函数:

[FunctionName("Func1")]
public Task<IActionResult> GetFunc1([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req)

    Foo foo = new foo();
    foo.prop1 = "string1";
    foo.prop2 = "string2";  // prop3 and 4 are undefined

    var result = foo.GetType().GetProperties()
                    .Where(x => x.PropertyType == typeof(string))   // check type
                    .Select(x => (x.Name + ": " + (string)x.GetValue(foo)))   // get values
                    .Where(value => !string.IsNullOrEmpty(value));    // filter results

    return Task.FromResult<IActionResult>(new JsonResult(result)
     
        StatusCode = 200
    );

返回


    "prop1: string1",
    "prop2: string2",
    "prop3: ",
    "prop4: "

它不是 json 格式(每个属性和值都应该用双引号括起来。空属性也会被返回,但不应该如此。如果我将结果计算修改为:

var result = foo.GetType().GetProperties()
.Where(x => x.PropertyType == typeof(string))   // check type
.Select(x => (string) x.GetValue(foo))   // get values
.Where(value => !string.IsNullOrEmpty(value)  // filter result

我只得到没有像

这样的属性名称的值

    "string1",
    "string2"

如何格式化结果查询以返回 json 格式的非空属性和值,如下所示:


    "prop1": "string1",
    "prop2": "string2"

编辑:这是@Matt 和@rené-carannanante 在重复问题中提出的解决方案:

首先,用属性更新类:

public class Foo

    public string prop1  get; set; 
    public string prop2  get; set; 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string prop3  get; set; 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string prop4  get; set; 

其次,通过让 Newtonsoft.Json 为我们自动删除空属性的工作来清理我的函数:

[FunctionName("Func1")]
public Task<IActionResult> GetFunc1([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req)

    Foo foo = new foo();
    foo.prop1 = "string1";
    foo.prop2 = "string2";  // prop3 and 4 are undefined

    return Task.FromResult<IActionResult>(new JsonResult(foo)
     
        StatusCode = 200
    );

它现在会自动返回正确的 json:


    "prop1": "string1",
    "prop2": "string2"

而不是没有 nullValueHandling 的默认值:


    "prop1": "string1",
    "prop2": "string2",
    "prop3": null,
    "prop4": null

【问题讨论】:

如果在选择之前有这样的 where 怎么办: .Where(x => (x.PropertyType == typeof(string)) && !string.IsNullOrEmpty(x.GetValue(foo)) ) ? 是的,谢谢@Matt 和 René - 我想我隐约记得 NullValueHandling=NullValueHandling.Ignore 属性,但没想到在这里应用它。这可以完美地自动删除空值。再次感谢您的专业知识!我会支持你的 cmets,但没有足够的声誉/积分来做到这一点...... 我建议在这里发布您的解决方案并将其标记为答案,以便可以关闭问题并且其他人可以看到解决方案:) @LajosArpad - 如果我使用该语法,它会抱怨您建议添加的代码的第二部分,并带有错误 Argument 1: cannot convert from 'object' to 'string' 我明白了。我们可以解决这个问题,但没有必要这样做,因为问题已经解决了。 【参考方案1】:

您不应该自己构建序列化,而是使用专门的库。

使用最多的是Newtonsoft,非常好用。你有一个掘金队。

https://www.newtonsoft.com/json

您会在这里找到很多示例:

https://www.newtonsoft.com/json/help/html/SerializeObject.htm

【讨论】:

以上是关于如何以json格式从类返回非空属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

以 JSON 格式返回 API [重复]

管理从 web api 以 json 格式返回的属性名称

Mysql 返回JSON值属性的函数

如何将查出的日期Data类型以Json格式输出到前端

如何以 JSON 格式返回 Glassdoor API

如何在视图 Django 中更改渲染以返回 json [重复]