简单的Json.NET任务,但完全困惑



我一直在寻找使用json.net的方法,我有以下简单的测试用例。

JObject jsonData = JObject.Parse("{"nodes": { "left": {"att": 1.0, "ch": 0}, "right": {"att": 1.0, "ch": 1}}}");
    var nodes = jsonData ["nodes"].Children ();
    foreach (JToken node in nodes) {
        JToken speaker = node.First;
        float attenuation = (float)speaker ["att"];
        int channel = (int)speaker ["ch"];
        string nodeName = /* HOW TO GET THE OBJECT NAME HERE ("left","right" in this example json) */
    }

当我在对象上迭代时,我还没能弄清楚如何在这个json中访问对象名称(在这个例子中是左/右)。

是我的解析策略完全错误还是我错过了一些明显的东西?

由于这里的jsonData["nodes"]JObject,那么jsonData["nodes"].Children()是包含JProperties的可枚举数。每个JProperty都有一个Name和一个Value。您只需要根据需要将JToken转换回JProperty(或JObject)。

把你的foreach循环改成:

foreach (JProperty node in nodes)
{
    string nodeName = node.Name;
    JObject speaker = (JObject)node.Value;
    float attenuation = (float)speaker["att"];
    int channel = (int)speaker["ch"];
}

顺便说一下,如果你有一个JToken,你不知道它是什么类型的(例如JProperty, JObject, JArray等),你可以看看JToken上的Type属性。

如果您的最终目标仅仅是将JSON转换为常规的字典和列表,那么您可能会发现这个答案很有帮助。

我不太确定您想要实现什么,但是为什么您需要知道对象的名称作为字符串?通常你在JSON中有一些结构,如果你知道你总是有两个孩子"左"one_answers"右",那么你可以使用jsonData["nodes"]["left"]jsonData["nodes"]["right"]来获得相应的对象,并继续向下获取数据。

如果你可以有任意数据,我建议使用数组代替"name": "left", "name": "right"。

最好的方法是将字符串反序列化为普通的c#类,例如:
string value = "your json here"
MyObject obj = JsonConvert.DeserializeObject<MyObject>(value);

MyObject只是一个模仿JSON结构的类。在你的例子中,它将只有节点属性,将是IEnumerable<Node>,其中Node将有LeftRight属性,等等。

相关内容

  • 没有找到相关文章