简单的Json.NET任务,但完全混淆

时间:2016-10-23 12:38:46

标签: .net json 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中访问对象名称(在本例中为左/右)。

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

2 个答案:

答案 0 :(得分:1)

由于jsonData["nodes"]此处为JObject,因此jsonData["nodes"].Children()是包含JProperties的可枚举项。每个JProperty都有NameValue。您只需根据需要将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并且你不知道它是什么类型,(例如JPropertyJObjectJArray等。)您可以查看Type上的JToken属性。

如果您的最终目标仅仅是将JSON转换为常规词典和列表,您可能会发现this answer有帮助。

答案 1 :(得分:0)

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

如果您可以拥有任意数据,我建议使用数组代替"名称":"左","名称":"右&# 34。

即使最好的方法是将字符串反序列化为普通的C#类,例如:

string value = "your json here"
MyObject obj = JsonConvert.DeserializeObject<MyObject>(value);

MyObject只是一个模仿JSON结构的类。在您的情况下,它将只有IEnumerable<Node>的Nodes属性,其中Node将具有LeftRight属性等等。