我一直在寻找使用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
将有Left
和Right
属性,等等。