json 检查嵌套对象是否包含任何具有空值的属性

f2uvfpb9  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(154)

我有一个结果响应对象,需要将其反序列化并转换为JSON对象,如下所示:

var responseBody = await response.Content.ReadAsStringAsync();
var deviceSeqNrResponse = JsonConvert.DeserializeObject(responseBody);

deviceSeqNrResponse看起来像

{
    "dataMod": 1,
    "deviceId": "myDeviceID",
    "seqNum": [
      {
          "ApplicationType": null,
          "exampleId": 8
      }
    ]
}

我尝试测试这个逻辑,看看"seqNum": []中是否有嵌套在result对象中的属性,我尝试了.Contains和其他方法,但没有成功。
我正在使用.NET 6。
我想达到的目标是:
Assert"seqNum": []中不存在空值等于true的属性。

pkwftd7m

pkwftd7m1#

    • 方法1:使用 * 牛顿软件公司***

1.通过.SelectToken()选择元素"序列号"。
1.从 * 1 * 中获取所有值(返回嵌套数组)。通过.SelectMany()展开嵌套数组。
1.与.Any()一起使用Type == JTokenType.Null从结果 * 2 * 中查找任意元素。
1.对 * 3 * 的结果求反,以指示不存在具有以下值的元素:null.

JToken token = JToken.Parse(responseBody);

bool hasNoNullValueInSeqNumber = !token.SelectToken("sequenceNumbers")                                                    
                                .SelectMany(x => x.Values())
                                .Any(x => x.Type == JTokenType.Null);
    • 方法二:使用 * 系统反射***

1.从SequenceNumber类获取所有公共属性。
1.使用.All()来评估SequenceNumbers列表中的所有对象不包含任何具有值的属性:null.

using System.Linq;
using System.Reflection;

bool hasNoNullValueInSeqNumber = typeof(SequenceNumber).GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .All(x => !deviceSeqNrResponse.SequenceNumbers.Any(y => x.GetValue(y) == null));

Demo @ .NET Fiddle

yrefmtwq

yrefmtwq2#

检查以下示例:

string responseBody = @"{
            'dataModelVersion': 1,
            'deviceIdentifier': 'myDeviceID',
            'sequenceNumbers': [
                {
                    'consumingApplication': 'Gateway',
                    'configurationSequenceNumber': 8
                },
                null
            ]
        }";

        JToken token = JToken.Parse(responseBody);
        if (token.SelectToken("sequenceNumbers").Any(item=>item.Type == JTokenType.Null))
        {
            Console.WriteLine("found.");
        }
        else
        {
            Console.WriteLine("not found.");
        }

        JObject deviceSeqNrResponse = (JObject)token;

相关问题