Как сделать JObject из JObject? - PullRequest
       1

Как сделать JObject из JObject?

0 голосов
/ 26 октября 2018

У меня есть такой json:

{
   "Diagnoses": {
        "WESTERN EQUINE ENCEPHALITIS": {
            "ICD": "A83.1",
            "ID": "9"
        }
     },
   "ICD": {
        "A83.1": {
            "Name": "WESTERN EQUINE ENCEPHALITIS",
            "ID": "9"
        },
        "A83.2": {
            "Name": "EASTERN EQUINE ENCEPHALITIS",
            "ID": "10"
        }

     }
}

Мой настоящий json намного длиннее.В диагнозах и ICD имеется около 8000 наименований.Я пытаюсь найти лучший способ загрузить все ключи в список.Во-первых, у меня есть весь JSON в JObject.Чтобы поместить его в список, я делаю это:

IList<JToken> jsonDiagName = jDiagnosis["Diagnoses"].Children().ToList();

foreach (JToken diagnosis in jsonDiagName)
            {
                cb_DiagName.Items.Add(diagnosis.ToObject<JProperty>().Name);
            }

Где jDiagnosis - это объект JO.Однако, поскольку в json содержится около 9000 элементов, загрузка списка занимает около 3 минут.Поэтому я искал более эффективные способы сделать это и нашел this .

Однако, чтобы попробовать это предложение, мне нужно извлечь json из раздела «Diagnoses», чтобы он был JObject ofсвой.Итак, как я могу сделать JObject из существующего JObject?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Итак, мне удалось решить это самому.

Я взял то, что @New Contributer предложил десериализовать JSON, но вместо этого я сериализовал JObject в строку, а затем проанализировал эту строку обратно в новый JObject.

string diags = JsonConvert.SerializeObject(jDiagnosis["Diagnoses"]);
JObject jDiags = JObject.Parse(diags);

string[] names = jDiags.Properties().Select(p => p.Name).ToArray();
cb_DiagName.Items.AddRange(names);

Не уверен, почему этот мыслительный процесс не произошел со мной раньше. : /

0 голосов
/ 26 октября 2018

Если вы имеете дело с большим объектом, как вы говорите, вы, вероятно, не хотите читать все это сразу в память, вам следует использовать json reader.

Если вы хотите просто прочитатьключи корневого объекта, вы можете сделать это:

IEnumerable<string> GetKeys(string path)
{
    using (var reader = new JsonTextReader(File.OpenText(path)))
    {
        while (reader.Read())
        {
            switch (reader.TokenType)
            {
            case JsonToken.PropertyName:
                if ((string)reader.Value == "Diagnoses") // only interested in "Diagnoses" property
                {
                    foreach (var key in _GetKeys(reader))
                        yield return key;
                    yield break;
                }
                reader.Skip();
                break;
            }
        }
    }

    IEnumerable<string> _GetKeys(JsonReader reader)
    {
        while (reader.Read())
        {
            switch (reader.TokenType)
            {
            case JsonToken.PropertyName:
                yield return (string)reader.Value;
                reader.Skip(); // skip the value of the property
                break;
            case JsonToken.EndObject:
                yield break;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...