c# - 如何从嵌套的 JSON 对象中获取键的字符串值?
问题描述
JSON:
{
event_name: 'request_queue_items',
event_data: {
amount: 20
},
}
事件处理程序:
private void OnMessage(string message)
{
if (!message.Contains("{") || !message.Contains("}"))
{
return; // It's not JSON, we don't care...
}
var jsonObject = (JObject)JsonConvert.DeserializeObject(message);
var eventName = jsonObject["event_name"].Value<string>();
var eventData = jsonObject["event_data"].Value<string>();
Console.WriteLine("RECEIVED: " + eventName);
Console.WriteLine("WITH DATA: " + eventData);
Console.WriteLine();
Console.WriteLine();
}
错误信息:Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken
堆栈跟踪:
12/12/2020 15:19:07 [Error] Application Error System.InvalidCastException: Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken.
at Newtonsoft.Json.Linq.Extensions.Convert[T,U](T token)
at Newtonsoft.Json.Linq.Extensions.Value[T,U](IEnumerable`1 value)
at Newtonsoft.Json.Linq.Extensions.Value[U](IEnumerable`1 value)
解决方案
您可以执行以下操作。使用 JObject.Parse 并使用 JObject 而不是字符串。您仍然可以使用 .ToString() 将内部 json 作为字符串获取:
if (!message.Contains("{") || !message.Contains("}"))
{
return; // It's not JSON, we don't care...
}
var jsonObject = JObject.Parse(message); // use JObject
var eventName = jsonObject["event_name"].Value<string>();
var eventData = jsonObject["event_data"].Value<JObject>(); //use JObject as it is not a string
Console.WriteLine("RECEIVED: " + eventName);
Console.WriteLine("WITH DATA: " + eventData);
Console.WriteLine();
eventData.ToString() 的值将是:
event_data: {
amount: 20
},
推荐阅读
- wso2 - 登录 wso2-is 没有租户域
- c++ - 在变量前面添加 : 会给出错误的结果
- clojure - 不同命名空间中的 Clojurescript defprotocol 和 defrecord
- mips - 我在 MIPS 中写了一个循环,但由于某种原因它一直在无限运行?
- react-native - 不变违规:[2365,"RCTView",11,{"position":"absolute","width":"<
>","height":4 不能用作本机方法参数 - android-studio - 如何在 Android Studio 中重新启动线程?
- javascript - setTimeout 没有按预期工作 React Native
- java - 使用 Python 连接到 AWS ActiveMQ 代理
- node.js - 如何使用 jest-mock-axios 来测试调用 axios.get 的函数?
- google-cloud-platform - 即使谷歌云中的磁盘已满,快照大小是否小于实际磁盘大小?