【问题标题】:How to count objects in JSON file如何计算 JSON 文件中的对象
【发布时间】:2021-10-07 06:08:42
【问题描述】:

我正在尝试在我的 C# 项目中读取 .json 文件并计算另一个对象中的对象数量。

.json 文件已修复,我无法对其进行任何更改。

例如

.json 文件如下所示:

{
  "X": {
    "x": "...",
    "x1": "..."
  },
  "Y": {
    "y": { }
    "y1": { },
    "y2": { },
    "y3": { },
    "y4": { },
    "functiongroup": {
        "function1": {
            "A": "...",
            "B": "...",
            "C": "...",
            "D": "...",
            "subfunction": {
                "sub1": {
                    "a": "...",
                    "b": "...",
                    "c": "..."
                }
            }
        },
        "function2": {
            "A": "...",
            "B": "...",
            "C": "...",
            "D": "...",
            "subfunction": {
                "sub1": {
                    "a": "...",
                    "b": "...",
                    "c": "...",
                    "d": "..."
                },
                "sub2": {
                    "a": "...",
                    "b": "...",
                    "d": "..."
                },
                "sub3": {
                    "a": "...",
                    "b": "...",
                    "c": "..."
                }
            }
        },
        "function3": {
            "A": "...",
            "B": "...",
            "C": "...",
            "D": "...",
            "subfunction": {
                "sub1": {
                    "a": "...",
                    "b": "...",
                    "c": "...",
                    "d": "..."
                },
                "sub2": {
                    "a": "...",
                    "b": "...",
                    "d": "..."
                },
                "sub3": {
                    "a": "...",
                    "b": "...",
                    "c": "..."
                }
            }
        },
       "function2": {
            "A": "...",
            "B": "...",
            "C": "...",
            "D": "...",
            "subfunction": {
                "sub1": {
                    "a": "...",
                    "b": "...",
                    "c": "...",
                    "d": "..."
                },
                "sub2": {
                    "a": "...",
                    "b": "...",
                    "d": "..."
                },
                "sub3": {
                    "a": "...",
                    "b": "...",
                    "c": "...""
                },
                 sub4": {
                    "a": "...",
                    "b": "...",
                    "c": "..."
                }
            }
        }
    }
 
}

现在我想知道每个函数中有多少子函数并在控制台中打印数量。 所以在显示的示例中,它看起来像这样:

输出

1, 3, 3, 4

我尝试过多种变体,例如

var JsonFile = System.IO.File.ReadAllText(@"PathtoFile");

var token = JToken.Parse(JsonFile);
var FG = token.Value<JArray>("subfunction");
int count = FG.Count();

Console.WriteLine(count);

【问题讨论】:

  • 根据问题中的类型名称,您似乎正在使用 Json.NET。这个库也有它自己的标签,如果是这种情况,你可以添加它。由于using 指令不在你的问题中,我不能确定,所以我不会自己添加标签。
  • HM 看起来你有属性而不是数组项(在 JSON 数组中表示为 []
  • 您的文件不是有效的 JSON。它必须以{[ 开头,并且缺少一些结束标记。能否提供一个有效的文件?
  • 如何将 json 文件解析为字符串并尝试查找“子函数”字符串的数量?是的,这可能很棘手......但是:)
  • @lufefon 您能否修改您的问题以发布 有效 json。 This website 可以帮助您识别当前 json 的问题。

标签: c# json json.net


【解决方案1】:

修复示例 json 后:

{
  "X": {
    "x": "...",
    "x1": "..."
  },
  "Y": {
    "y": {

    },
    "y1": {

    },
    "y2": {

    },
    "y3": {

    },
    "y4": {

    },
    "functiongroup": {
      "function1": {
        "A": "...",
        "B": "...",
        "C": "...",
        "D": "...",
        "subfunction": {
          "sub1": {
            "a": "...",
            "b": "...",
            "c": "..."
          }
        }
      },
      "function2": {
        "A": "...",
        "B": "...",
        "C": "...",
        "D": "...",
        "subfunction": {
          "sub1": {
            "a": "...",
            "b": "...",
            "c": "...",
            "d": "..."
          },
          "sub2": {
            "a": "...",
            "b": "...",
            "d": "..."
          },
          "sub3": {
            "a": "...",
            "b": "...",
            "c": "..."
          }
        }
      },
      "function3": {
        "A": "...",
        "B": "...",
        "C": "...",
        "D": "...",
        "subfunction": {
          "sub1": {
            "a": "...",
            "b": "...",
            "c": "...",
            "d": "..."
          },
          "sub2": {
            "a": "...",
            "b": "...",
            "d": "..."
          },
          "sub3": {
            "a": "...",
            "b": "...",
            "c": "..."
          }
        }
      },
      "function4": {
        "A": "...",
        "B": "...",
        "C": "...",
        "D": "...",
        "subfunction": {
          "sub1": {
            "a": "...",
            "b": "...",
            "c": "...",
            "d": "..."
          },
          "sub2": {
            "a": "...",
            "b": "...",
            "d": "..."
          },
          "sub3": {
            "a": "...",
            "b": "...",
            "c": "..."
          },
          "sub4": {
            "a": "...",
            "b": "...",
            "c": "..."
          }
        }
      }
    }
  }
}

您可以像这样检索所需的值:

JObject semiParsedJson = JObject.Parse(json);
var functionGroup = semiParsedJson["Y"]["functiongroup"];

for (int i = 1; i < 5; i++)
{
    var function = functionGroup[$"function{i}"];
    var subFunctions = function["subfunction"];
    Console.WriteLine(subFunctions.Count());
}

请记住,索引器操作符是脆弱的。请在生产代码中优先使用TryGetValue,以便在沿路径移动之前执行存在性检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多