C# 如何将JObject转换成JObject?
我有这样一个json: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"
{
"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,谢谢您的回答。你的建议是我想做的。但是,我不想读取根对象的键,我想读取子对象的键。您必须更改实现以查找所需的对象并输出键。但想法是一样的。