c# - 将字符串转换为十六进制后字符串中的奇数十六进制长度
问题描述
我需要通过服务器发送消息。消息参数是: MsgTitle和MsgBody。我需要将消息从缓冲区转换为十六进制,但出现错误:
Newtonsoft.Json.JsonReaderException:'输入字符串'64756D6D7920746578742068657265'不是有效数字。
这是我正在使用的 JSON 数据:
var json = @"{
Mess: [
{
Msg: {
MsgTitle: " + hex + @",
MsgBody: " + hex + @"
}
}
]
}";
我为解决该问题而实施的代码:
string msg = "dummy text here";
byte[] utfBytes = System.Text.Encoding.UTF8.GetBytes(msg);
string hex = BitConverter.ToString(utfBytes).Replace("-", "");
我还尝试了很多我在这里找到的 HEX 转换器功能,但似乎它们都没有工作,我不明白我做错了什么。另外,有人告诉我,只允许 URL 中允许的字符。
解决方案
问题是您的 JSON 包含如下属性:
MsgTitle: 64756D6D7920746578742068657265,
MsgBody: 64756D6D7920746578742068657265
这就是你表示数字的方式。对于strings,您需要引号,如下所示:
MsgTitle: "64756D6D7920746578742068657265",
MsgBody: "64756D6D7920746578742068657265"
此外,属性的名称也应该用引号引起来:
"MsgTitle": "64756D6D7920746578742068657265",
"MsgBody": "64756D6D7920746578742068657265"
避免此类问题的最简单方法是首先不将 JSON 直接构造为字符串。相反,请使用 JSON API,例如 Json.NET。这是使用匿名类型执行此操作的示例代码,尽管还有其他各种方法:
using System;
using System.Text;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
string msg = "dummy text here";
byte[] utfBytes = System.Text.Encoding.UTF8.GetBytes(msg);
string hex = BitConverter.ToString(utfBytes).Replace("-", "");
var obj = new
{
Mess = new[]
{
new
{
Msg = new
{
MsgTitle = hex,
MsgBody = hex
}
}
}
};
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
Console.WriteLine(json);
}
}
输出:
{
"Mess": [
{
"Msg": {
"MsgTitle": "64756D6D7920746578742068657265",
"MsgBody": "64756D6D7920746578742068657265"
}
}
]
}
这现在是有效的 JSON - 并且更容易编写正确的代码。
推荐阅读
- pyspark - DataFrame 连接中的不明确列 - 无法别名或调用
- powershell - 在 Azure CLI 中使用包含哈希的资源 ID
- r - 合并具有不同行数的数据框
- reactjs - 如何解决 Reactjs 中的“Firebase:错误(auth/invalid-api-key)”错误?
- java - 在akka流中保持物化值类型divertTo或alsoTo
- sql - 我在我的 SQL 数据库中使用这个“创建视图”做错了什么
- indicator - Tradingview 更高的时间框架 RSI 指标在更低的时间框架当前值
- html - 在摘要标记的同一行上浮动右跨度,没有 div 清除都中断到下一行
- laravel - 为什么该变量在节目中未定义?(已解决)
- google-analytics - GA4 - Google Data Studio - 特定事件指标