JSON(JObject)到C#对象:无法打印Pusher接收到的数据

JSON(JObject)到C#对象:无法打印Pusher接收到的数据,c#,visual-studio,unity3d,pusher,C#,Visual Studio,Unity3d,Pusher,我使用Pusher实现实时通信 以下是我从pusher获取数据的函数: private已连接(对象发送方) { Debug.Log(“已连接”); channel.Bind(“我的事件”,(动态数据)=> { Log(“收到我的事件”); Log(data.GetType().ToString()); Debug.Log(((JObject)data.ToString());// { Log(“收到我的事件”); Log(data.GetType().ToString()); Log(((JOb

我使用Pusher实现实时通信

以下是我从pusher获取数据的函数:

private已连接(对象发送方)
{
Debug.Log(“已连接”);
channel.Bind(“我的事件”,(动态数据)=>
{
Log(“收到我的事件”);
Log(data.GetType().ToString());
Debug.Log(((JObject)data.ToString());//
{
Log(“收到我的事件”);
Log(data.GetType().ToString());
Log(((JObject)data.ToString());
PusherEvent pe=((作业对象)数据).ToObject();
//PusherEvent pe=JsonConvert.DeserializeObject(((JObject)data.ToString());
Debug.Log(pe.channel);
});
}
私有void Pusher连接状态已更改(对象发送方,连接状态)
{
Log(“连接状态已更改”);
}
private void onPusherError(对象s、PusherException e)
{
调试日志(“出错”);
}
已订阅通道上的专用void(对象s)
{
Debug.Log(“订阅”);
}
Application Quit()上的异步任务
{
如果(推送器!=null)
{
等待pusher.DisconnectAsync();
}
}
}
解决方案 我终于做到了。问题实际上是根对象是一个
JObject
,而此对象的
data
属性是一个
string
,~,而不是另一个
JObject
~:

//PusherManager.cs
// ...
PEvent pe=新PEvent(pusherEvent);
Debug.Log(pe);
// ...
//PEvent.cs
使用Newtonsoft.Json.Linq;
使用制度;
[可序列化]
公共类事件
{
公共字符串@事件;
公共字符串频道;
公共数据;
公共事件(动态推送事件)
{
这是@event=pusherEvent[“event”];
this.channel=pusherEvent[“channel”];
this.data=JObject.Parse((string)pusherEvent[“data”]).ToObject();
}
公共重写字符串ToString()
{
返回data.ToString();
}
}

对于等于c#关键字的字段名,可以使用a并命名

public string @event;
见例

或者,您也可以根据需要命名字段,但添加一个Accord属性,以明确告诉JSON.NET在JSON中如何命名Accord字段

[JsonProperty("event")]
public string Event;
见例


然后,您显示的
数据将只是一个嵌套类

[Serializable]
public class Data
{
    public string foo;
}
所以你的班级应该看起来像

[Serializable]
public class Response
{
    public string @event;
    // or
    //[JsonProperty("event)]
    //public string Event;

    public Data data;

    public string channel;
}
如果您实际上需要它是动态的,因为从推送器接收不同的数据结构,那么您应该特别检查,例如

为此,您仍然需要知道字段的名称


或者您可以为您的字段创建一个,您可以首先通过来检查接收到的数据结构中是否存在某个字段。

感谢您的帮助,这将我推向了一个好的方向,但不幸的是,它仍然不起作用。我用更多的信息编辑了我的问题。你能发布你的完整代码吗?完成:完整代码@derHugoIs这个
Bind
回调可能是在不同的线程上执行的。。可能存在ab异常,但您无法在控制台中看到它?您可以尝试将其包装在
try{PusherEvent pe=((JObject)data.ToObject();Debug.Log(pe.channel);}catch(Exception e){Debug.LogError($“{e.GetType}-{e.Message}/n{e.stackTrace}”)}
@derHugo非常感谢,它正在进行:
Newtonsoft Json.Json.JsonSerializationException-错误转换值“{foo”:“bar}”键入“数据”。路径“数据”。
[Serializable]
public class Data
{
    public string foo;
}
[Serializable]
public class Response
{
    public string @event;
    // or
    //[JsonProperty("event)]
    //public string Event;

    public Data data;

    public string channel;
}
dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;