在多个 JSON 字符串中查找节点的平均值

本文关键字:查找 节点 平均值 字符串 JSON | 更新日期: 2023-09-27 18:31:15

我已经搜索了许多主题,也找到了一些相关的答案,但我仍然无法找到解决方案,因此我发布了这个问题。

问题描述

EmployeeResponse1 = [{"Ques":"1","Rating":"7"},{"Ques":"2","Rating":"1"},{"Ques":"3","Rating":"6"},{"Ques":"4","Rating":"1"},{"Ques":"5","Rating":"1"},{"Ques":"6","Rating":"1"},{"Ques":"7","Rating":"7"},{"Ques":"8","Rating":"1"},{"Ques":"9","Rating":"1"},{"Ques":"10","Rating":"1"},{"Ques":"11","Rating":"1"},{"Ques":"12","Rating":"1"},{"Ques":"13","Rating":"1"},{"Ques":"14","Rating":"1"},{"Ques":"15","Rating":"1"},{"Ques":"16","Rating":"10"}]
EmployeeResponse2 = [{"Ques":"1","Rating":"5"},{"Ques":"2","Rating":"4"},{"Ques":"3","Rating":"7"},{"Ques":"4","Rating":"8"},{"Ques":"5","Rating":"5"},{"Ques":"6","Rating":"9"},{"Ques":"7","Rating":"10"},{"Ques":"8","Rating":"4"},{"Ques":"9","Rating":"9"},{"Ques":"10","Rating":"6"},{"Ques":"11","Rating":"6"},{"Ques":"12","Rating":"6"},{"Ques":"13","Rating":"7"},{"Ques":"14","Rating":"7"},{"Ques":"15","Rating":"9"},{"Ques":"16","Rating":"8"}]

我在 c# 中有这两个 JSON 字符串(可能还有更多)。现在我想制作一个最终的 JSON 字符串,如下所示:

EmployeeResponseAvg = [{"Ques":"1","Rating":"6"},{"Ques":"2","Rating":"2.5"},{"Ques":"3","Rating":"6.5"},{"Ques":"4","Rating":"4.5"},{"Ques":"5","Rating":"3"},{"Ques":"6","Rating":"5"},{"Ques":"7","Rating":"8.5"},{"Ques":"8","Rating":"2.5"},....,{"Ques":"16", "Rating": "9"}]
就像我想要 Ques = 1 的评级应该是评级(Ques = 1 的字符串

1)和评级(Ques = 1 的字符串 2)的平均值......其他问题也是如此

即像 FINAL =[{ QUES = 1, RATING = (Emp1(Rating.WHERE(QUES = 1),

Emp2(Rating.WHERE(QUES = 1),)。平均),....................}]

到目前为止的工作

模型 -> 调查响应.cs

public class SurveyResponse
{
    public string Ques { get; set; }
    public string Rating { get; set; }
}
public class ResponseDataCalls
{
    public static SurveyResponse PutData(string t, string v)
    {
        SurveyResponse s = new SurveyResponse();
        s.Ques = t;
        s.Rating = v;
        return s;
    }
}

WebAPI RevGroupChartController.cs

public class RevGroupChartController : ApiController
{
    private hr_toolEntities _db = new hr_toolEntities();
    public object Get(int cid, int gid)
    {
        spiderChart obj = new spiderChart();
        var group_employees = (from ge in _db.hrt_group_employee
                               where ge.fk_group_id == gid
                               select ge.fk_employee_id).ToList();
        List<string> EMP = new List<string>();
        List<string> SUP = new List<string>();
        List<SurveyResponse> EmpResponse = new List<SurveyResponse>();
        List<SurveyResponse> SupResponse = new List<SurveyResponse>();
        List<List<SurveyResponse>> tmpEMP = new List<List<SurveyResponse>>();
        List<List<SurveyResponse>> tmpSUP = new List<List<SurveyResponse>>();
        foreach(var emp in group_employees)
        {
            int eid = Convert.ToInt32(emp);
            var Data = (from d in _db.hrt_cycle_response
                        join g in _db.hrt_cycle_groups on d.hrt_cycle.pk_cycle_id equals g.fk_cycle_id
                        where d.fk_cycle_id == cid && g.fk_group_id == gid && d.fk_employee_id == eid
                        select new
                        {
                            d.response_employee_answers,
                            d.response_supervisor_answers
                        }).First();
            EMP.Add(Data.response_employee_answers);
            SUP.Add(Data.response_supervisor_answers);
        }
        foreach(var e in EMP)
        {
            //tmpEMP = new JavaScriptSerializer().Deserialize<TEMP>(e);
            var s = new JavaScriptSerializer();
            List<SurveyResponse> em = s.Deserialize<List<SurveyResponse>>(e);
            tmpEMP.Add(em);
        }
        foreach (var s in SUP)
        {
            //tmpSUP = new JavaScriptSerializer().Deserialize<TEMP>(s);
            var e = new JavaScriptSerializer();
            List<SurveyResponse> sp = e.Deserialize<List<SurveyResponse>>(s);
            tmpSUP.Add(sp);
        }
        var empl = _db.hrt_questions.Select(x => new { x.question_name }).ToList();
        List<int[]> Emprating = new List<int[]>();
        //int avgRating;
        int cnt = 0;
        foreach(var item in tmpSUP)
        {
            int noofQ = item.Count;
            int[] i = new int[noofQ];
            for (int y = 0; y > tmpSUP.Count; y++)
            {
                i[y] = Convert.ToInt32(item[cnt].Rating);
            }
            Emprating.Add(i);
            cnt++;
        }
        //obj.Employee = Data.response_employee_answers;
        //obj.Supervisor = Data.response_supervisor_answers;
        obj.ques = new List<object>();
        for (int i = 0; i < empl.Count; i++)
        {
            obj.ques.Add(empl[i].question_name);
        }
        return obj;
    }
    public class TEMP
    {
        public List<SurveyResponse> data { get; set; }
    }
}

代码解释

我传递了一个周期 ID 和一个组 ID...每个小组有1名以上的员工,每个员工都有一名主管因此,如果说组 ID 1023 有 2 名员工。现在我们有2名员工和2名主管我们每个人都有一个 JSON 记录

LIKE DB TABLE RESPONSE {fk_emp_id, fk_sup_id, cycle_id, emp_reponse(json), supervisor_response(json)}

所以我需要为员工制作一个 JSON 字符串(其中包含所有评级的平均值)和一个用于主管的 JSON 字符串(同样,两个 JSON 的平均值)根据团体规模,可以有任意数量的员工每个员工将始终有一个主管

简而言之,我想要一个字符串,例如:

FinalEmployeeResponse = [{'Ques': '1', 'Rating': 'R1'}, {'Ques': '2', 'Rating': 'R2'}, {'Ques': '3', 'Rating': 'R3'}, {'Ques': '4', 'Rating': 'R4'}, ........, {'Ques': '16', 'Rating': 'R16'}]

在这里,R1 = AVERAGE(Emp1json.Rating.WHERE('Ques' = 1), Emp2json.Rating.WHERE('Ques' = 1), .....)

R2 = AVERAGE(Emp1json.Rating.WHERE('Ques' = 2), Emp2json.Rating.WHERE('Ques' = 2), .....)

。等等....

期待您的回复。

我是堆栈溢出的新手,如果我错过了什么,请询问更多详细信息。

在多个 JSON 字符串中查找节点的平均值

执行此操作的正确方法是将其解析为 JSON。快速而肮脏的方式是:

    static void Main(string[] args)
    {
        string json1 = @"[{""Ques"":""1"",""Rating"":""7""},{""Ques"":""2"",""Rating"":""1""},{""Ques"":""3"",""Rating"":""6""},{""Ques"":""4"",""Rating"":""1""},{""Ques"":""5"",""Rating"":""1""},{""Ques"":""6"",""Rating"":""1""},{""Ques"":""7"",""Rating"":""7""},{""Ques"":""8"",""Rating"":""1""},{""Ques"":""9"",""Rating"":""1""},{""Ques"":""10"",""Rating"":""1""},{""Ques"":""11"",""Rating"":""1""},{""Ques"":""12"",""Rating"":""1""},{""Ques"":""13"",""Rating"":""1""},{""Ques"":""14"",""Rating"":""1""},{""Ques"":""15"",""Rating"":""1""},{""Ques"":""16"",""Rating"":""10""}]";
        string json2 = @"[{""Ques"":""1"",""Rating"":""5""},{""Ques"":""2"",""Rating"":""4""},{""Ques"":""3"",""Rating"":""7""},{""Ques"":""4"",""Rating"":""8""},{""Ques"":""5"",""Rating"":""5""},{""Ques"":""6"",""Rating"":""9""},{""Ques"":""7"",""Rating"":""10""},{""Ques"":""8"",""Rating"":""4""},{""Ques"":""9"",""Rating"":""9""},{""Ques"":""10"",""Rating"":""6""},{""Ques"":""11"",""Rating"":""6""},{""Ques"":""12"",""Rating"":""6""},{""Ques"":""13"",""Rating"":""7""},{""Ques"":""14"",""Rating"":""7""},{""Ques"":""15"",""Rating"":""9""},{""Ques"":""16"",""Rating"":""8""}]";
        string averages = AverageNodes(json1, json2);
        Console.WriteLine(averages);
        Console.ReadKey();
    }
    private static string AverageNodes(params string[] json)
    {
        var regex = new Regex(@"(""Ques"":""(?<question>'d+)"",""Rating"":""(?<rating>'d+)"")", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
        var ANUs = regex.Matches(string.Join("", json))
            .Cast<Match>()
            .Select(m => new { Question = m.Groups["question"].Value, Rating = int.Parse(m.Groups["rating"].Value) })
            .GroupBy(a => a.Question, a => a.Rating)
            .Select(a => string.Format("{{'"Ques'":'"{0}'",'"Rating'":'"{1}'"}}", a.Key, a.Average()));
        return "[" + string.Join(",", ANUs) + "]";
    }

我使用 LINQ 找到了 1 行答案。

double _avg1 = tmpEMP.Select(x => Convert.ToInt32(x.ElementAt(i).Rating)).Average();