Получить имя Id из Json, используя linq - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть JSON следующим образом

{
  "code": "0",
  "message": "success",
  "appointments": [
    {
      "patient_id": "1",
      "patient_name": "Jairaj Test",
    },
    {
      "patient_id": "2",
      "physician_name": "Test Physician",
    }
  ]
}

Я хочу получить pateint_name от этого с помощью Patientid, используя LINQ в c#

Я пробовал как

var jsonLinq = JObject.Parse(ResponseContent);
jsonLinq["appointments"].AsEnumerable().Select(p => p["patient_name"]).Where(s => Convert.ToString(s["patient_id"]).Equals(2)

Ответы [ 5 ]

0 голосов
/ 04 февраля 2020

если ваш JSON не является динамическим c, вы также можете создать некоторые классы моделей, которые представляют ваши JSON данные:

public class Appointment
{
    [JsonProperty("patient_id")]
    public string PatientId { get; set; }
    [JsonProperty("patient_name")]
    public string PatientName { get; set; }
    [JsonProperty("physician_name")]
    public string PhysicianName { get; set; }
}

public class RootObject
{
    [JsonProperty("code")]
    public string Code { get; set; }]
    [JsonProperty("message")]
    public string Message { get; set; }
    [JsonProperty("appointments")]
    public List<Appointment> Appointments { get; set; }
}

Затем вы можете десериализовать и извлечь имена пациентов с помощью Where() и Select():

var jsonObject = JsonConvert.DeserializeObject<RootObject>(response);

var patient = jsonObject
    .Appointments
    .Where(a => a.PatientId.Equals("2"))
    .Select(a => a.PatientName);

Или вы можете просто получить первый найденный с помощью FirstOrDefault():

var patient = jsonObject
   .Appointments
   .FirstOrDefault(a => a.PatientId.Equals("2"))
   .PatientName;
0 голосов
/ 04 февраля 2020

Здесь важен порядок Select и Where. Вам необходимо сначала отфильтровать полные записи «пациент» с помощью Where, прежде чем извлекать свойство «имя пациента» с помощью Select. Как только вы запустите функцию отображения Select, ваш IEnumerable будет содержать только то, что вы выбрали, а не элемент, из которого вы его выбрали.

Select до Where (не работает ):

var jsonLinq = JObject.Parse(ResponseContent);
// whole JObject
jsonLinq["appointments"]
// "appointments" object
  .AsEnumerable()
  // "appointments" as list of KeyValuePair<string, JToken>
  .Select(p => p["patient_name"])
  // list of all "patient_name" JTokens
  .Where(s => Convert.ToString(s["patient_id"]).Equals(2))
  // Error: JTokens "Jairaj Test" and "Test Physician" don't have any "patient_id" property

Where до Select (работает):

var jsonLinq = JObject.Parse(ResponseContent);
// whole JObject
jsonLinq["appointments"]
// "appointments" object
  .AsEnumerable()
  // "appointments" as list of KeyValuePair<string, JToken>
  .Where(s => Convert.ToString(s["patient_id"]).Equals(2))
  // filtered list of all patient objects where "patient_id" is "2"
  .Select(p => p["patient_name"])
  // list of all "patient_names" from the previously filtered list
0 голосов
/ 04 февраля 2020

Начните с Where, а затем Select

var results =  jsonLinq["appointments"]
                .Where(s => s["patient_id"].ToString() == "1")
                .Select(p => p["patient_name"]);
0 голосов
/ 04 февраля 2020

Вы можете использовать

var name = jsonLinq.SelectToken($"$.appointments[?(@.patient_id == '{idToSearch}')].patient_name")
                   .Value<string>();
0 голосов
/ 04 февраля 2020
jsonLinq["appointments"].AsEnumerable().Where(s => Convert.ToString(s["patient_id"]).Equals(2)).Select(p => p["patient_name"]).FirstOrDefault().ToString();

Получил ответ !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...