【问题标题】:Validating an Equal Object Json in a List Array C#在列表数组 C# 中验证相等的对象 Json
【发布时间】:2021-10-23 04:14:40
【问题描述】:

我是初学者,在验证与数组中的列表具有相同值的对象时遇到问题。问题看起来很简单,但我在操作对象时遇到了麻烦。 我有一个名为 ApprovedLevels 的数组,其中包含一些用户对象,它们是“批准级别”。 但是,有一个错误,有时前端会在“Ordination”对象中向我们发送相同的值,而我需要在后端做的是,每当 Ordination 值等于 ApprovalLevels 列表中的一个时,它需要添加+1,对收到的相同排序值进行一些增量,或跳转到列表中的下一个值。

这是我得到的 Json:

"ApprovalLevels":[
        {
            "Ordination": 10,
            "Users": [
                {
                    "UserId": 116
                }
            ]
        },
        {
            "Ordination": 10,
            "Users": [
                {
                    "UserId": 118
                }
            ]
        }

    ]

在下面,我将放置到目前为止我尝试做的所有代码,我使用的技术是 .net 框架 3,并且我也在使用 newtonsoft 来操作、反序列化对象。 在代码中,这个排序是由接收列表的用户完成的:

JArray newLevelsArray = JArray.FromObject(levelsArray.Where(l => l["Id"] == null).ToList());

    foreach (JObject newLevelObject in newLevelsArray)
    {
        BusinessRuleApprovalLevel newLevel = PloomesUtils.JsonToObject<BusinessRuleApprovalLevel>(newLevelObject);

        JArray ordinationObj = JArray.FromObject(levelsArray.Where(o => o["Ordination"] != null).ToList());
     
        newLevel.Ordination = (int)ordinationObj;

        JObject equalOrdination = levelsArray.FirstOrDefault(eo => eo["Ordination"] != null && (int)eo["Ordination"] == newLevel.Ordination) as JObject;

        if (JObject.Equals(ordinationObj, equalOrdination))
        {
            BusinessRuleApprovalLevel deletedOrdination = BusinessRuleApprovalLevel.Find(newLevel.Ordination);
            BusinessRuleApprovalLevel.Remove(deletedOrdination);
            SaveChanges();
        }

        newLevel.Ordination = (int)ordinationObj;
        newLevel.BusinessRuleId = ruleId;

        BusinessRuleApprovalLevel.Add(newLevel);

        SaveChanges();

        if (newLevelObject.Property("Users") != null && newLevelObject["Users"].Type != JTokenType.Null)
            UpdateApprovalLevelUsers(newLevel.Id, (JArray)newLevelObject["Users"]);
    }

【问题讨论】:

  • 对不起,但我在“Ordination”中看不到相同的值,我什至看不到 ordination 里面有什么。你能举两个例子来解释一下:你有什么和你想要什么。
  • 这个“ApprovalLevels”数组已经是示例,您将看到对象“Ordination”内部包含值 10,然后具有不同用户的下一个值也具有值 10。我需要要做的是处理两个用户都包含相同“Ordination”值的情况。我希望我能更好地解释它并感谢您的回答
  • 谢谢,你能发布第二个例子吗?你的解释包含的字母太多,我永远都读不完

标签: arrays json .net list json.net


【解决方案1】:

我认为操作 JObject 和 JArray 非常令人困惑,所以我的第一个提示是你定义对象并转换它,这样你就可以轻松地操作它。

我根据自己的理解做了一些实验:

首先,我定义对象:

public class Root {
    public List<ApprovaLevel> ApprovalLevels {get; set;}
}
public class ApprovaLevel {
    public int Ordination {get; set;}
    public List<User> Users {get; set;}
}
public class User {
    public int UserId {get; set;}
}

然后我可以玩转换和治疗:

public static void Main()
{
    var teste1 = GetFinalObject("{\"ApprovalLevels\":[ {\"Ordination\": 10,\"Users\": [{\"UserId\": 116}]},{\"Ordination\": 10,\"Users\": [{\"UserId\": 118}]}]}");     
    Console.WriteLine(JsonConvert.SerializeObject(teste1));
    
    var teste2 = GetFinalObject("{\"ApprovalLevels\":[ {\"Ordination\": 10,\"Users\": [{\"UserId\": 116}]},{\"Ordination\": 10,\"Users\": [{\"UserId\": 119}]},{\"Ordination\": 10,\"Users\": [{\"UserId\": 118}]}]}");     
    Console.WriteLine(JsonConvert.SerializeObject(teste2));
    
    
    var teste3 = GetFinalObject("{\"ApprovalLevels\":[ {\"Ordination\": 10,\"Users\": [{\"UserId\": 116}]},{\"Ordination\": 10,\"Users\": [{\"UserId\": 119}]},{\"Ordination\": 10,\"Users\": [{\"UserId\": 118}]},{\"Ordination\": 11,\"Users\": [{\"UserId\": 118}]},{\"Ordination\": 11,\"Users\": [{\"UserId\": 118}]},{\"Ordination\": 13,\"Users\": [{\"UserId\": 118}]},{\"Ordination\": 21,\"Users\": [{\"UserId\": 118}]}]}");     
    Console.WriteLine(JsonConvert.SerializeObject(teste3));
}
public static object GetFinalObject(string json)
{
    Root root = JsonConvert.DeserializeObject<Root>(json);
    root.ApprovalLevels = root.ApprovalLevels.OrderBy(b => b.Ordination).ThenBy(u => string.Join("|", u.Users.Select(us => us.UserId))).ToList();
    
    foreach (var level in root.ApprovalLevels)
    {
        var originalLevelsWithSameOrdination = root.ApprovalLevels.Where(a => a.Ordination == level.Ordination).ToArray();
        if(originalLevelsWithSameOrdination.Count() > 1)
        {
            var previousOrdination = level.Ordination;
            foreach (var item in originalLevelsWithSameOrdination.Skip(1))
            {
                item.Ordination = ++previousOrdination;
            }
        }           
    }
    return root;
}

我的输出:

{"ApprovalLevels":[{"Ordination":10,"Users":[{"UserId":116}]},{"Ordination":11,"Users":[{"UserId":118}]}]}
{"ApprovalLevels":[{"Ordination":10,"Users":[{"UserId":116}]},{"Ordination":11,"Users":[{"UserId":118}]},{"Ordination":12,"Users":[{"UserId":119}]}]}
{"ApprovalLevels":[{"Ordination":10,"Users":[{"UserId":116}]},{"Ordination":11,"Users":[{"UserId":118}]},{"Ordination":12,"Users":[{"UserId":119}]},{"Ordination":13,"Users":[{"UserId":118}]},{"Ordination":14,"Users":[{"UserId":118}]},{"Ordination":15,"Users":[{"UserId":118}]},{"Ordination":21,"Users":[{"UserId":118}]}]}

无论如何,我认为您也应该了解前端发生了什么,因为您在未经用户同意的情况下假设新订单

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2021-05-18
    • 2020-09-23
    • 2018-02-23
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2016-08-10
    • 2020-10-31
    相关资源
    最近更新 更多