c# 转换可能包含一个、一个或多个对象的嵌套 JSON

问题描述 投票:0回答:1

我正在 PowerShell 中编写一个 Azure Function App 来管理 Exchange Online 用户的邮箱设置。 (否 不可用 vs MS Graph) 我想看看有哪些小组成员。当我发出命令时

$getDistListOutput = Get-DistributionGroupMember  @getDistListparms |   Where-Object {$_.alias -ne $SelfIdentity} | Select-Object Identity 

我可以在

$getDistListOutput
、空、一个用户或多个用户中获得三种类型的结果之一。当我获取输出
$getDistListOutput
并将其转换为 JSON 并添加到现有 JSON 结构时,我会遇到以下三种情况之一:

//没有群成员

{
  "ForwardingAddressID": "{\"Identity\":\"smtp:[email protected]\"}",
  "GroupMembers": null
}

//单个组成员

{
  "ForwardingAddressID": "{\"Identity\":\"smtp:[email protected]\"}",
  "GroupMembers": "{\"Identity\":\"smtp:[email protected]\"}",
}

//多个群组成员

{
  "ForwardingAddressID": "{\"Identity\":\"smtp:[email protected]\"}",
  "GroupMembers": ["{\"Identity\":\"smtp:[email protected]\"}","{\"Identity\":\"smtp:[email protected]\"}"]
}

不,我正在尝试将返回的数据映射到 C# 类中。以下内容适用于

ForwardingAddressID
,尽管我似乎无法想出使用其 3 个变体解码 GroupMembers 的正确方法。

           ExchPS_GetUserMailData_Reply getUserMailDataReplyDeserialized = JsonConvert.DeserializeObject<ExchPS_GetUserMailData_Reply>(AzureResponseDeserialized.OutputData);
                
           if (!(string.IsNullOrWhiteSpace(getUserMailDataReplyDeserialized.ForwardingAddressID)))
           {
               ExchPS_UserIdentity_Data forwardingAddressIDSerializedReply = JsonConvert.DeserializeObject<ExchPS_UserIdentity_Data>(getUserMailDataReplyDeserialized.ForwardingAddressID);

               if ((forwardingAddressIDSerializedReply != null) )
               {
                   if (forwardingAddressIDSerializedReply.Identity != null)
                   {
                       ForwardMbx = true;
                       ForwardMbxTo = forwardingAddressIDSerializedReply.Identity;
                   }
                   else
                   {
                       ForwardMbx = false;
                       ForwardMbxTo = "";
                   }
               }

           }

如果 GroupMembers 的值中没有设置任何内容,则不要执行任何操作。 如果第一个有 [,则它是一个数组。 如果第一个有 {,则它是单个。

if (!(string.IsNullOrWhiteSpace(getUserMailDataReplyDeserialized.GroupMembers)))
{
    if (getUserMailDataReplyDeserialized.GroupMembers[0] == '[')
    {
        ExchPS_GroupMembers_Reply[] getGroupMembersSerializedReply = JsonConvert.DeserializeObject<ExchPS_GroupMembers_Reply[]>(getUserMailDataReplyDeserialized.GroupMembers);
        if ((getGroupMembersSerializedReply != null))
        {
            if (getGroupMembersSerializedReply.First != null)
            {
                ForwardMbx = true;
                //ForwardMbxTo = getGroupMembersSerializedReply.Identity[0].Identity;
            }
            else
            {
                ForwardMbx = false;
            }
        } 
    } else if (getUserMailDataReplyDeserialized.GroupMembers[0] == '{')
    {
        ExchPS_UserIdentity_Data getGroupMembersSerializedReply = JsonConvert.DeserializeObject<ExchPS_UserIdentity_Data>(getUserMailDataReplyDeserialized.GroupMembers);
        if (getGroupMembersSerializedReply != null)
        {
            if (getGroupMembersSerializedReply.Identity != null)
            {
                ForwardMbx = true;
                ForwardMbxTo = getGroupMembersSerializedReply.Identity;
            }
            else
            {
                ForwardMbx = false;
            }
        }
    }
}

定义的类:

// Single User Identity
class ExchPS_UserIdentity_Data
{
    [JsonProperty(nameof(Identity))]
    public string Identity { get; set; } = string.Empty;
}

// Array of User Identities
[JsonArray]
class ExchPS_GroupMembers_Reply
{
    [JsonProperty(nameof(Identity))]
    public string Identity { get; set; } = string.Empty;
}


class ExchPS_GetUserMailData_Reply
{
    [JsonProperty(nameof(GroupMembers))]
    public string GroupMembers { get; set; } = string.Empty;

    [JsonProperty(nameof(ForwardingAddressID))]
    public string ForwardingAddressID { get; set; } = string.Empty;
}
c# json powershell
1个回答
0
投票

因此,在 PowerShell JSON 创建方面,我将

-AsArray
添加到哈希表的 ConvertTo-Json 中。这允许 One 或 >One 的情况全部为 Array(List) 类型

    $getDistListOutput = Get-DistributionGroupMember  @getDistListparms |   Where-Object {$_.alias -ne $DLIdentity} | Select-Object Identity  

$PSCmdOutput = @{
    ForwardingAddressID = $getForwardingAddressIDOutput | ConvertTo-Json -Compress -Depth 10 
    GroupMembers = $getDistListOutput | ConvertTo-Json -AsArray -Compress -Depth 10 
    AutoReplyConfig = $getMbcAutoReplytConfigOutput | ConvertTo-Json -Compress -Depth 10
}

在C#接收端。我将 GroupMembers 类设置为

[JsonArray]
,将成员设置为
List<ExchPS_UserIdentity_Data>

类型
// Single User Identity
class ExchPS_UserIdentity_Data
{
    [JsonProperty(nameof(Identity))]
    public string Identity { get; set; } = string.Empty;
}

// Array of User Identities
[JsonArray]
class ExchPS_GroupMembers_Reply
{
    [JsonProperty(nameof(GroupMembers))]
    public List<ExchPS_UserIdentity_Data>? GroupMembers { get; set; } 
}

//Reply from Azure Function
class AzureReply
{   
 [JsonProperty("OutputData")]
 public string OutputData { get; set; } = string.Empty;

 [JsonProperty("PSCommandOutput")]
 public string PSCommandOutput { get; set; } = string.Empty;

 [JsonProperty("Error")]
 public string Error { get; set; } = string.Empty;

 [JsonProperty("Exception")]
 public string Exception { get; set; } = string.Empty;

 }

从返回的 JSON 成员中获取数据的代码。

 //Get the reply from Azure and get the members
 AzureReply AzureResponseDeserialized = JsonConvert.DeserializeObject<AzureReply>(AzureResponse);

 [...snip...]

 //Get the OutputData member
ExchPS_GetUserMailData_Reply getUserMailDataReplyDeserialized = JsonConvert.DeserializeObject<ExchPS_GetUserMailData_Reply>(AzureResponseDeserialized.OutputData);


//If the GroupMembers is NULL we didn't get a member
if (!(string.IsNullOrWhiteSpace(getUserMailDataReplyDeserialized.GroupMembers)))
{
                       
    List<ExchPS_UserIdentity_Data> getGroupMembersDeserializedReply = JsonConvert.DeserializeObject<List<ExchPS_UserIdentity_Data>>(getUserMailDataReplyDeserialized.GroupMembers);
    if ((getGroupMembersDEserializedReply != null))
    {
        //Just deal with the First Member at this point. 
        ExchPS_UserIdentity_Data firstgroupmember = getGroupMembersDeserializedReply.First();

        if (!(string.IsNullOrWhiteSpace(firstgroupmember.Identity)))
        {
            ForwardSendAs = true;
            ForwardSendAs1 = true;

            ForwardTo = firstgroupmember.Identity;
                                
        }
        else
        {
            ForwardSendAs = false;
        }
    } 
                        
}
© www.soinside.com 2019 - 2024. All rights reserved.