【问题标题】:POST Json with encoded non-ANSII characters带有编码非 ASCII 字符的 POST Json
【发布时间】:2017-12-29 04:07:30
【问题描述】:

我必须使用西里尔符号字符串发布 Json 数据,如下所示:

string json = { "message": "Привет" }

我想我需要发送这样的东西:

string json = { "message": "\u041F\u0440\u0438\u0432\u0435\u0442" }

所以我尝试转义非 ascii 编码的字符:

string privet = "\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442";

但是服务器不接受这个,因为字符串是按原样传递的,带有双反斜杠:

string json = { "message": "\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442" }

也不接受UTF-8编码:

byte[] bJson = Encoding.UTF8.GetBytes(json);

如何获取所需格式的字符串?


更新

public class Test
{
     public string message { get; set; }
}

Test myTest = new Test{ };

myTest.message = "\\u041F\\u0440\\u0438\\u0432\\u0435\\u0442";
string json = JsonConvert.SerializeObject(myTest, Formatting.Indented);

byte[] sbBites = Encoding.ASCII.GetBytes(json);
Uri url = new Uri("https://example.net");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentLength = sbBites.Length;
request.ContentType = "application/json";

using (Stream requestStream = request.GetRequestStream())
{
     requestStream.Write(sbBites, 0, sbBites.Length);
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

【问题讨论】:

  • 很难看出是什么导致了请求的问题,因为问题不包含任何与之相关的代码...请查看minimal reproducible example在问题中提供代码的指导。
  • 有关自动转义 JSON 字符串的信息,请参阅 this Q&A。您应该能够将 "Привет" 文字传递给该方法,并获取正确的值。
  • 您是否尝试按原样发​​布数据,而不进行干预?我想这应该可行。
  • @JLRishe 这是一个很好的建议,但不幸的是,在这种情况下,服务器会返回错误。
  • @AntoshaShmonoff 出了什么问题?

标签: c# json http


【解决方案1】:

解决办法

string json = JsonConvert.SerializeObject(myTest, Formatting.Indented,
new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii });

【讨论】:

    【解决方案2】:

    难怪您的服务器收到的值带有一堆反斜杠,因为您发送给它的字符串值中有一堆反斜杠。

    你试过了吗:

    public class Test
    {
         public string message { get; set; }
    }
    
    string privet = "Привет";
    
    Test myTest = new Test { };
    
    myTest.message = privet;
    string json = JsonConvert.SerializeObject(myTest, Formatting.Indented);
    
    byte[] sbBites = Encoding.UTF8.GetBytes(json);
    Uri url = new Uri("https://example.net");
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.ContentLength = sbBites.Length;
    request.ContentType = "application/json";
    
    using (Stream requestStream = request.GetRequestStream())
    {
         requestStream.Write(sbBites, 0, sbBites.Length);
    }
    
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    

    【讨论】:

    • 它将按原样发送字符串,而服务器只接受转义一个。
    • 也有Serialize(privet, StringEscapeHandling.EscapeNonAscii) 方法,但是它返回相同的双反斜杠字符串...
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多