JSON数据不完整

时间:2016-01-13 09:46:21

标签: c# json api xamarin json.net

我和另外两名学生正在与Xamarin一起制作多平台运动应用程序。 该应用程序可以在培训时收集数据,用户可以查看培训和 测量(最后一项由运动医生完成)。

我们使用API​​从在线数据库中获取内容。 获取当前用户的培训列表可以正常工作。 但是,在获取测量列表时,JSON数据似乎不完整。

有关测量的数据库结构,请参见下图。每个测量都有一些全局数据保存在“Metingen”中。测量结果保存在“Resultaten”表中。结果的每一行(例如权重,BMI等)在“Resultaten”表中都有自己的行。每个测量结果都有一个TypeID。这用于从“类型”表中获取测量类型的数据(例如,名称=“重量”,单位=“kg”等)。

我们目前在JSON数据中缺少的是measurementdetail的名称(例如,“Types”表中的“Weight”或“BMI”)。 我们在JSON数据中得到了正确的TypeID,但并不总是来自表中的数据(我们试图得到的3个测量中的一个测量完全完成)。相反,我们得到Type:{“$ ref:1}

提前致谢!

测量数据库图表 Database diagram for measurements

一个测量结果的JSON(一行) JSON for one measurement result (one row)

执行api调用的方法:

    private void getMeasurementsFromDB()
    {
        HttpResponseMessage response = new ApiRequest()
            .SetLogin(UserRepository.Instance().login)
            .Get("api/meting");

        if (response.StatusCode == HttpStatusCode.OK)
        {
            var JSON = response.Content.ReadAsStringAsync();
            var jsonarray = JsonConvert.DeserializeObject(JSON.Result);

            JArray measurements = JArray.FromObject(jsonarray);
            foreach (JObject measurement in measurements)
            {
                if (!MeasurementRepository.Instance().measurementExistsLocally((int)measurement["ID"]))
                {
                    int measurementId = (int)measurement["ID"];
                    DateTime date = (DateTime)measurement["Datum"];
                    string userId = (string)measurement["Deelnemer"]["Login"];
                    string conclusion = (string)measurement["Conclusie"];
                    int state = (int)measurement["Status"];
                    LocalMeasurementModel tempMeasurement = new LocalMeasurementModel(measurementId, date, userId, conclusion, state);
                    MeasurementRepository.Instance().saveMeasurementModel(tempMeasurement);

                    JArray locationInfos = (JArray)measurement["Resultaten"];
                    foreach (JObject result in locationInfos)
                    {
                        LocalMeasurementDetailModel localResults = new LocalMeasurementDetailModel();
                        localResults.measurementId = (int)measurement["ID"];
                        if (!String.IsNullOrEmpty((string)result["WaardeString"]))
                        {
                            localResults.value = (string)result["WaardeString"];
                        }
                        if (!String.IsNullOrEmpty((string)result["WaardeFloat"]))
                        {
                            localResults.value = (string)result["WaardeFloat"];
                        }
                        localResults.unit = (string)result["Type"]["Eenheid"];
                        localResults.name = (string)result["Type"]["Naam"];
                        MeasurementRepository.Instance().saveMeasurementDetailModel(localResults);
                    }
                }
            }
        }
        else if (response.StatusCode == HttpStatusCode.Forbidden)
        {

        }
        else
        {

        }
        MeasurementRepository.Instance().busy = false;
        loadMeasurements();
    }

API使用实体框架。 接收呼叫的API函数:

    [IsalaAuthorize(Rechten =
        "meting_eigen_ophalen, " +
        "meting_alle_ophalen")]
    [GET("api/meting")]
    public IEnumerable<Meting> GetMetingen()
    {
        var principal = HttpContext.Current.User;

        if (principal.IsInRole("meting_alle_ophalen"))
        {
            Log.Info("[Metingen] Alle metingen worden opgehaald.");
            return Metingen.GetAll();
        }
        Log.Info("[Metingen] Alle metingen van gebruiker '" + principal.Identity.Name + " worden opgehaald.");
        return Metingen.GetAllByGebruiker(principal.Identity.Name);
    }

从数据库获取数据的API方法

    public IEnumerable<Meting> GetAllByGebruiker(string id)
    {
        db.Configuration.ProxyCreationEnabled = false;
        IEnumerable<Meting> metingen = db.Metingen
             .Include("Deelnemer")
             .Include(c => c.Resultaten)
             .Include("Resultaten.Type")
             .Where(m => m.Deelnemer.Login.Contains(id))
             .OrderByDescending(x => x.Datum);

        foreach (Meting meting in metingen)
        {
            meting.Resultaten = meting.Resultaten
                .Where(r => r.Revisie == meting.Resultaten.Where(rm => rm.TypeID == r.TypeID)
                    .Max(rm => rm.Revisie))
                .ToList();
        }
        return metingen;
    }

0 个答案:

没有答案