使用JSON.net c#和嵌套数组读取JSON

使用JSON.net c#和嵌套数组读取JSON,c#,json,json.net,C#,Json,Json.net,我有一个JSON格式的数据集,使用C#JSON.net库,我试图将数据读取为串联字符串,但提取数据时遇到问题。数据有根元素,然后是行。对于“rows”中的每一行,我想列出 [“conversionPathValue”][“nodeValue”]值并将它们连接在一起,然后将它们与基本值连接起来。下面是两行的示例代码: "rows": [ [ { "conversionPathValue": [ {

我有一个JSON格式的数据集,使用C#JSON.net库,我试图将数据读取为串联字符串,但提取数据时遇到问题。数据有根元素,然后是行。对于“rows”中的每一行,我想列出 [“conversionPathValue”][“nodeValue”]值并将它们连接在一起,然后将它们与基本值连接起来。下面是两行的示例代码:

      "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