在 web api c# 中返回字节数组的 Json

Returning Json of byte array in web api c#

您好,我开发了一个 Web API,我在其中获取 URL 中的一些参数,然后对其进行处理。我使用的协议是 Modbus。它 return 是一个字节数组,在 return 中,我想从中获取一些特定的字符串数据。下面是我的代码

  public string GetData(int slaveId, int dataAddress, int registerCount)
    {

        //string hexValue = intValue.ToString("X");
        // Convert the hex string back to the number
        int slaveHex = int.Parse(slaveId.ToString("X"), System.Globalization.NumberStyles.HexNumber);
        int addressHex = int.Parse(dataAddress.ToString("X"), System.Globalization.NumberStyles.HexNumber);
        int countHex = int.Parse(registerCount.ToString("X"), System.Globalization.NumberStyles.HexNumber);


        //serial port settings and opening it
        var serialPort = new SerialPort("COM2", 9600, Parity.Even, 8, StopBits.One);

        serialPort.Open();

        var stream = new SerialStream(serialPort);
        stream.ReadTimeout = 200;
        // send request and waiting for response
        // the request needs: slaveId, dataAddress, registerCount            
        var responseBytes = stream.RequestFunc3(slaveHex, addressHex, countHex);

        // extract the content part (the most important in the response)
        var data = responseBytes.ToResponseFunc3().Data;         

        //Convert a byte array to string
        var stringFromByteArray = System.Text.Encoding.UTF8.GetString(data);
        serialPort.Close();

        return stringFromByteArray;
    }

data 包含一个 14 字节的数组

stringFromByteArray return以下

"[=13=]�[=13=]�[=13=]�[=13=]\u0016[=13=]\u0017[=13=]\u0018[=13=]\u001a"

如您所见,returned 字符串与预期不符。我想要数据字节数组中的精确值。

我希望它在 Json response 中的结果输出。喜欢下面

{
  [0] => "220",
  [1] => "230",
  [2] => "240", 
  [3] => "22",
  [4] => "23",
  [5] => "24",
  [6] => "26",
} 

我该怎么做?任何帮助将不胜感激。

从广义上讲,您有多种选择。

首先,您可以考虑在 HTTP 响应中使用 application/octet-stream 作为响应类型而不是 application/jsonapplication/octet-stream 表示字节直接通过 HTTP 发送。这就是您通常 upload/download 文件的方式。

其次,可以以更安全的方式将二进制数据编码为文本,例如使用编码算法,例如 Base64, which you can achieve in .NET using Convert.ToBase64String 方法。这种方法比使用 octet-stream 更冗长,但在尝试发送具有某些二进制内容的结构化数据时也能发挥更好的作用。

最后,根据您的要求,您可以使用结构直接表示数据。有几种选择,您可以直接对数字数组进行编码,这将产生 JSON 有效负载为:

[220, 230, 240, 22, 23, 24, 26]

为此,您只需序列化一个数字列表,例如byte[] 直接或可能 int[] 基于序列化程序的行为(.NET Core 3.0+ System.Test.Json.JsonSerializer 将字节数组转换为 base64,因此需要转换为 int[])。 Live sample.

您请求的结构在 JSON 中无法直接实现,但您可以实现类似序列化 Dictionary<string, string> 的结果,生成 { "0": "220", "1": "230", "2":"240" ... } 的结构。但是请注意,此结构非常冗长且不太实用。

您可以使用以下代码段获取字典:

var bytes = new byte[] { 220, 230, 240, 22, 23, 24, 26 };

var dictionary = bytes
    .Select((b, i) => (value: b, index: i)) // convert bytes to sequence of (byte value, index)
    .ToDictionary(x => x.index.ToString(), x => x.value.ToString());