使用JSON.net c#和嵌套数组读取JSON
我有一个JSON格式的数据集,使用C#JSON.net库,我试图将数据读取为串联字符串,但提取数据时遇到问题。数据有根元素,然后是行。对于“rows”中的每一行,我想列出 [“conversionPathValue”][“nodeValue”]值并将它们连接在一起,然后将它们与基本值连接起来。下面是两行的示例代码:使用JSON.net c#和嵌套数组读取JSON,c#,json,json.net,C#,Json,Json.net,我有一个JSON格式的数据集,使用C#JSON.net库,我试图将数据读取为串联字符串,但提取数据时遇到问题。数据有根元素,然后是行。对于“rows”中的每一行,我想列出 [“conversionPathValue”][“nodeValue”]值并将它们连接在一起,然后将它们与基本值连接起来。下面是两行的示例代码: "rows": [ [ { "conversionPathValue": [ {
"rows": [
[
{
"conversionPathValue": [
{
"interactionType": "CLICK",
"nodeValue": "MET"
}
]
},
{
"primitiveValue": "20130122"
},
{
"primitiveValue": "000"
},
{
"primitiveValue": "000001"
},
{
"primitiveValue": "000"
},
{
"primitiveValue": "11"
},
{
"primitiveValue": "7290.521799"
}
],
[
{
"conversionPathValue": [
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"interactionType": "CLICK",
"nodeValue": "MET"
},
{
"nodeValue": "(none)"
},
{
"nodeValue": "(none)"
},
{
"interactionType": "CLICK",
"nodeValue": "organic"
}
]
},
{
"primitiveValue": "20130122"
},
{
"primitiveValue": "000"
},
{
"primitiveValue": "000011"
},
{
"primitiveValue": "005"
},
{
"primitiveValue": "1"
},
{
"primitiveValue": "1628.0"
}
],
.....etc........
使用以下代码:(jsonExtract是一个JObject)
var rows=jsonExtract[“根”][“行”][0]。Children();
foreach(JToken结果为行)
{
var primitiveValues=结果[“primitiveValue”].Values();
var pathValues=result[“conversionPathValue”].Values();
string joinedprimitiveValues=string.Join(“,”,primitiveValues);
string joinedpathValues=string.Join(“-”,pathValues);
file2.WriteLine(joinedpathValues+“,”+joinedprimitiveValues);
}
这就产生了一个错误
设置基本值时,“对象引用未设置为对象实例”
我知道问题可能在于嵌套元素,但我不知道如何满足这些要求。有人能帮忙吗?我认为您的代码中存在的问题是您没有处理
原语值
或路径值
为空的情况,这是因为您处理行的方式,实际上会在每次迭代中发生
例如,如果这是一行:
{
"primitiveValue": "20130122"
},
然后result[“conversionPathValue”]
将返回null
试试这个:
var obj = JObject.Parse(json);
var rows = obj["rows"].Children();
foreach (JToken row in rows)
{
List<string> conversionPaths = new List<string>();
List<string> primitiveValues = new List<string>();
foreach (JToken value in row.Children())
{
var primitiveValue = value["primitiveValue"];
if (primitiveValue != null)
{
primitiveValues.Add(primitiveValue.Value<string>());
}
var conversionPathValue = value["conversionPathValue"];
if (conversionPathValue != null)
{
var paths = conversionPathValue.Children()
.Where(t => t["nodeValue"] != null)
.Select(t => t["nodeValue"].Value<string>());
conversionPaths.AddRange(paths);
}
}
Console.WriteLine("Primitive Values:");
Console.WriteLine(string.Join(",", primitiveValues.ToArray()));
Console.WriteLine("Conversion Paths:");
Console.WriteLine(string.Join(",", conversionPaths.ToArray()) + "\n");
}
请注意,我在JSON周围添加了
{
和}
,以使其正常工作。下面这一行对我来说是爆炸性的:var primitiveValue=value[“primitiveValue”];“无法访问Newtonsoft.Json.Linq.JProperty上的子值。”@wloescher Json看起来像什么?听起来这个错误是因为当你有一个属性时试图访问一个孩子。我在同一个地方遇到了同样的错误。它发生在第一次尝试评估该行时。我在整个JSON文档中运行这段代码,其中包括根目录中的其他元素,但不包括行。我认为这可能是错误的原因,但如果wloescher正在使用示例片段进行尝试,那就不可能了above@AlistairMcIntyre我已经用我用来解析JSON的代码(前两行代码)更新了我的代码示例。试试看它是否有效。@wloescher该编辑可能也有助于解决您遇到的问题。
var obj = JObject.Parse(json);
var rows = obj["rows"].Children();
foreach (JToken row in rows)
{
List<string> conversionPaths = new List<string>();
List<string> primitiveValues = new List<string>();
foreach (JToken value in row.Children())
{
var primitiveValue = value["primitiveValue"];
if (primitiveValue != null)
{
primitiveValues.Add(primitiveValue.Value<string>());
}
var conversionPathValue = value["conversionPathValue"];
if (conversionPathValue != null)
{
var paths = conversionPathValue.Children()
.Where(t => t["nodeValue"] != null)
.Select(t => t["nodeValue"].Value<string>());
conversionPaths.AddRange(paths);
}
}
Console.WriteLine("Primitive Values:");
Console.WriteLine(string.Join(",", primitiveValues.ToArray()));
Console.WriteLine("Conversion Paths:");
Console.WriteLine(string.Join(",", conversionPaths.ToArray()) + "\n");
}
Primitive Values:
20130122,000,000001,000,11,7290.521799
Conversion Paths:
MET
Primitive Values:
20130122,000,000011,005,1,1628.0
Conversion Paths:
MET,MET,MET,MET,MET,MET,MET,MET,(none),(none),organic