我正在尝试反序列化实时聊天API json响应,以通过使用user_type进行过滤来访问消息ID和文本
JSON响应
{{
"events": [
{
"type": "agent_details",
"message_id": 1,
"timestamp": 1532396384,
"user_type": "agent",
"agent": {
"name": "Adam Harris",
"job_title": "Support Agent",
"avatar": "livechat.s3.amazonaws.com/default/avatars/ab5b0666feffd67600206cd519fd77ea.jpg"
}
},
{
"type": "message",
"message_id": 3,
"timestamp": 1532396387,
"user_type": "visitor",
"text": "hi"
}
]
}}
JsonOject类
class JsonLiveChatEvent
{
public class Rootobject
{
public Event[] events { get; set; }
}
public class Event
{
public string type { get; set; }
public int message_id { get; set; }
public int timestamp { get; set; }
public string user_type { get; set; }
public Agent agent { get; set; }
public string text { get; set; }
}
public class Agent
{
public string name { get; set; }
public string job_title { get; set; }
public string avatar { get; set; }
}
}
JsonConverter
string jsonStr= await Api.Chat.GetPendingMessages(visitorID, licenseID,
var chatEvent = JsonConvert.DeserializeObject<Rootobject>(jsonStr);
例如,chatEvent对象不会让我调用chatEvent.events.message_id
。任何帮助将不胜感激,因为这是我第一次在c#中使用json
答案 0 :(得分:0)
这里的主要问题是您的json无效,开头有一个额外的{
,在结尾有一个额外的}
。
然后,您可以使用提供的类型反序列化json
答案 1 :(得分:0)
与JSON无关,您已将JSON数据解析回Rootobject
。
现在,您以以下方式使用Rootobject
的实例:
Rootobject chatEvent = JsonConvert.DeserializeObject<Rootobject>(jsonStr);
Event event1 = chatEvent.events[0];
Event event2 = chatEvent.events[1];
还要考虑来自穆罕默德的答案,因为上述JSON会引发异常。
答案 2 :(得分:0)
您的json包含多个大括号,因此您必须先删除这些大括号
所以您的json看起来像
{
"events": [
{
"type": "agent_details",
"message_id": 1,
"timestamp": 1532396384,
"user_type": "agent",
"agent": {
"name": "Adam Harris",
"job_title": "Support Agent",
"avatar": "livechat.s3.amazonaws.com/default/avatars/ab5b0666feffd67600206cd519fd77ea.jpg"
}
},
{
"type": "message",
"message_id": 3,
"timestamp": 1532396387,
"user_type": "visitor",
"text": "hi"
}
]
}
此后,您必须根据user_type收集消息ID
然后我们为此创建枚举
public enum UserType
{
agent, visitor
}
然后,我们仅检查用户类型是否与上述枚举值中的任何一个匹配的事件。
如果您的json包含具有多种用户类型的多个事件,则将其收集到List<int>
中。
如果您的json仅包含每种用户类型的单个事件,则将它们收集到string
变量中。
Rootobject chatEvent = JsonConvert.DeserializeObject<Rootobject>(jsonStr);
List<int> agent_message_ids = new List<int>();
List<int> visitior_message_ids = new List<int>();
//string agent_message_id = string.Empty;
//string visitior_message_id = string.Empty;
foreach (Event e in chatEvent.events)
{
if (e.user_type == UserType.agent.ToString())
{
agent_message_ids.Add(e.message_id);
//agent_message_id = e.message_id;
}
if (e.user_type == UserType.visitor.ToString())
{
visitior_message_ids.Add(e.message_id);
//visitior_message_id = e.message_id;
}
}
我们只需获取存储特定user_type的消息ID的整数列表
尝试一次可能对您有帮助
结果:
agent_message_ids:
visitor_message_ids: