Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将JObject转换成JObject?_C#_Winforms_Json.net - Fatal编程技术网

C# 如何将JObject转换成JObject?

C# 如何将JObject转换成JObject?,c#,winforms,json.net,C#,Winforms,Json.net,我有这样一个json: { "Diagnoses": { "WESTERN EQUINE ENCEPHALITIS": { "ICD": "A83.1", "ID": "9" } }, "ICD": { "A83.1": { "Name": "WESTERN EQUINE ENCEPHALITIS", "ID": "9"

我有这样一个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);
            }
IList jsonDiagName=jDiagnosis[“诊断”].Children().ToList();
foreach(jsonDiagName中的JToken诊断)
{
cb_DiagName.Items.Add(diagnosis.ToObject().Name);
}
jDiagnosis是其中的工作对象。然而,json中有大约9000个条目,加载列表大约需要3分钟。因此,我寻找更有效的方法来做这件事,并发现

然而,为了尝试其中的建议,我需要将“Diagnostics”下的json提取为自己的JObject。那么,如何从现有的JObject生成JObject呢


谢谢

如果您正在处理一个大对象,正如您所说,您可能不想一次将其全部读入内存,那么您应该使用json读取器

如果只想读取根对象的键,可以执行以下操作:

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;
            }
        }
    }
}
IEnumerable GetKey(字符串路径)
{
使用(var reader=newjsontextreader(File.OpenText(path)))
{
while(reader.Read())
{
开关(reader.TokenType)
{
案例JsonToken.PropertyName:
if((string)reader.Value==“Diagnostics”)//仅对“Diagnostics”属性感兴趣
{
foreach(var-key-in_-getkey(读卡器))
屈服返回键;
屈服断裂;
}
reader.Skip();
打破
}
}
}
IEnumerable\u GetKeys(JsonReader)
{
while(reader.Read())
{
开关(reader.TokenType)
{
案例JsonToken.PropertyName:
产生返回(字符串)reader.Value;
reader.Skip();//跳过属性的值
打破
案例JsonToken.EndObject:
屈服断裂;
}
}
}
}

因此,我设法自己解决了这个问题

我采纳了@newcontributer对JSON反序列化的建议,但我将JObject序列化为string,然后将该字符串解析回一个新的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);

不知道为什么我之前没有想到这个想法/

您可以尝试将其反序列化为listHi,谢谢您的回答。你的建议是我想做的。但是,我不想读取根对象的键,我想读取子对象的键。您必须更改实现以查找所需的对象并输出键。但想法是一样的。