我一直在想办法使用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中访问对象名称(在本例中为左/右)。
我的解析策略是完全关闭还是我错过了一些明显的东西?
答案 0 :(得分:1)
由于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
等。)您可以查看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
将具有Left
和Right
属性等等。