从另一个程序接收 JSON 编码信息到我的 GUI

Posted

技术标签:

【中文标题】从另一个程序接收 JSON 编码信息到我的 GUI【英文标题】:Receiving JSON encoded information from another program to my GUI 【发布时间】:2020-08-03 20:26:58 【问题描述】:

我需要从另一个程序接收 JSON 信息并将其显示在我的 GUI 中。我刚刚使用的当前代码使程序崩溃。我已经研究了大约一周的问题,但似乎找不到解决方案。

这段代码应该从程序接收信息并反序列化数据。

public void TelemetryUpdateReceived()

        TelemetryUpdate tUpdate;
        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[256];
        javascriptSerializer javaScriptSerializer = new JavaScriptSerializer();

        while (client != null)
        
            int num_bytes = 0;
            num_bytes = stream.Read(buffer, 0, 256);
            string message = Encoding.ASCII.GetString(buffer, 0, num_bytes);
            DisplayMessages(message);

            tUpdate = javaScriptSerializer.Deserialize<TelemetryUpdate>(message);
            data.Altitude = tUpdate.Altitude;
            data.Elevator = tUpdate.ElevatorPitch;
            data.Pitch = tUpdate.Pitch;
            data.Speed = tUpdate.Speed;
            data.Throttle = tUpdate.Throttle;
            data.VerticalSpeed = tUpdate.VerticalSpeed;
            data.WarningCode = tUpdate.WarningCode;
         

我还有一个类来获取和设置数据。

class getData

        public double Altitude  get; set; 
        public double Speed  get; set; 
        public double Pitch  get; set; 
        public double VerticalSpeed  get; set; 
        public double Throttle  get; set; 
        public double Elevator  get; set; 
        public int WarningCode  get; set; 


struct TelemetryUpdate

        public double VerticalSpeed;
        public double Throttle;
        public double Altitude;
        public double Speed;
        public double Pitch;
        public double ElevatorPitch;
        public int WarningCode;

编辑:我忘了添加错误消息截图Error Message I Get

编辑 2:这是我用来显示数据的代码

private void DisplayMessages(string messageJ)
    
        ListViewItem listViewItem = new ListViewItem(new string[]  messageJ );
        this.lstBoxLatestData.Items.Insert(0, listViewItem);
        if (this.lstBoxLatestData.Items.Count > 40)
        
            lstBoxLatestData.Items.RemoveAt(lstBoxLatestData.Items.Count - 1);
        

    

设置断点后,这是一个 JSON 示例,它引发了带有“无效 JSON 原语”消息的异常:

"Altitude":-1.2874016160000004,"Speed":0,"Pitch":0,"VerticalSpeed":0,"Throttle":0,"ElevatorPitch":0,"WarningCode":0
"Altitude":-1.2874016160000004,"Speed":0,"Pitch":0,"VerticalSpeed":0,"Throttle":0,"ElevatorPitch":0,"WarningCode":0

【问题讨论】:

你能在message下添加你得到的字符串数据吗 “当前代码我刚刚使程序崩溃。” 是对错误的糟糕描述。你得到一个例外吗?如果是这样,什么错误信息?它有什么信息(调用堆栈)?是什么message 导致该代码失败? 为什么假设缓冲区是 256 字节? @Ygalbel op 后来使用num_bytes,到目前为止一切都很好,但我想知道序列化所需的所有数据是否都适合这 256 个字节,这就是为什么我问是什么输入导致了错误。 在你的截图中我看到最后被截断的文本,你能编辑你的问题并粘贴string message变量的内容吗? 【参考方案1】:

这不是有效的 JSON。它应该是:

单个元素

    "Altitude":-1.2874016160000004,
    "Speed":0,
    "Pitch":0,
    "VerticalSpeed":0,
    "Throttle":0,
    "ElevatorPitch":0,
    "WarningCode":0

对象数组。

注意:在这种情况下,您还应该更改 C# 结构以存储数组,最近的 Visual Studio 版本确实具有您可以使用的“将 JSON 粘贴为类”功能

[
    
        "Altitude":-1.2874016160000004,
        "Speed":0,
        "Pitch":0,
        "VerticalSpeed":0,
        "Throttle":0,
        "ElevatorPitch":0,
        "WarningCode":0
    ,
    
        "Altitude":-1.2874016160000004,
        "Speed":0,
        "Pitch":0,
        "VerticalSpeed":0,
        "Throttle":0,
        "ElevatorPitch":0,
        "WarningCode":0
    
]

【讨论】:

以上是关于从另一个程序接收 JSON 编码信息到我的 GUI的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个应用程序将图像共享到我的 Cordova/PhoneGap 应用程序?

将媒体从另一个应用程序共享到我的应用程序时,如何在我的 PWA 应用程序中处理媒体共享?

为啥我的 kivy 程序没有从另一个类调用函数?

如何从另一个线程更新 GUI 上的文本框 [重复]

AFNetworking 中的奇怪编码行为

Azure 逻辑应用接收图像 HTTP 触发器