如何通过 JsonSerializer 生成 JSON 而没有奇怪的斜杠字符?
How can I produce JSON without strangely slash character by JsonSerializer?
我用的JsonSerializer
是.net core 3.1System.Text.Json;
这里有两个项目,一个是项目A,一个是项目B。
这里是项目A的代码:
namespace WebApplication1.Controllers
{
[Route("api/")]
public class TestController : Controller
{
[HttpGet]
[Route("Get")]
public async Task<string> Get()
{
Models.TestModel TestModel = new Models.TestModel() { Success = "1" };
string Content = JsonSerializer.Serialize(TestModel, typeof(Models.TestModel), new JsonSerializerOptions() { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All) });
return Content;
}
}
}
这里是项目B的代码:
namespace WebApplication2
{
[Route("api/")]
public class TestController : Controller
{
private readonly IHttpClientFactory _clientFactory;
public TestController(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
[HttpGet]
[Route("TestGet")]
public async Task TestGet()
{
var request = new HttpRequestMessage(HttpMethod.Get,
string.Format("https://localhost:44345/api/Get"));
var client = _clientFactory.CreateClient();
client.Timeout = TimeSpan.FromSeconds(5);
var response = await client.SendAsync(request);
string Content = "";
if (response.IsSuccessStatusCode)
{
Content = await response.Content.ReadAsStringAsync();
Models.TestModel TestModel = new Models.TestModel();
TestModel = (Models.TestModel)JsonSerializer.Deserialize(Content, typeof(Models.TestModel));
}
}
}
}
他们都使用相同的模型:
public class TestModel
{
public string Success { get; set; } = "";
public string SuccessRemark { get; set; } = "";
}
现在的问题是项目 A 总是会生成 JSON 包含奇怪的字符 '\'。
比如右边的JSON就是
{"Success":"1","SuccessRemark":""}
结果会是这样:
"{\"Success\":\"1\",\"SuccessRemark\":\"\"}"
这个奇怪的字符'\'导致项目B无法正确反序列化。
我考虑过用替换的方法去掉字符'\'
我按照 Replacing backslash in a string 中的所有答案删除了字符“\”。同时,none 有效。
我知道另一种生成 json 的方法,没有奇怪的字符 '\':
[Produces("application/json")]
[HttpGet]
[Route("Get")]
public async Task<Models.TestModel> Get()
{
Models.TestModel TestModel = new Models.TestModel() { Success = "1" };
return TestModel;
}
嗯,这样只能return静态模型 while:
如果所有代码 运行 成功,我需要 return 一个成功模型。
如果代码 运行 有错误,我需要 return 一个错误模型。
这种方法不能解决这个问题。
你能帮帮我吗?谢谢。
试试这个
try
{
if (success)
return Json(new TestModel() { Success = "1" });
else
return Json(new TestModel() { Success = "0", SuccessRemark = "error" });
}
catch (Exception ex)
{
return Json(new TestModel() { Success = "0", SuccessRemark = ex.Message });
}
我用的JsonSerializer
是.net core 3.1System.Text.Json;
这里有两个项目,一个是项目A,一个是项目B。
这里是项目A的代码:
namespace WebApplication1.Controllers
{
[Route("api/")]
public class TestController : Controller
{
[HttpGet]
[Route("Get")]
public async Task<string> Get()
{
Models.TestModel TestModel = new Models.TestModel() { Success = "1" };
string Content = JsonSerializer.Serialize(TestModel, typeof(Models.TestModel), new JsonSerializerOptions() { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All) });
return Content;
}
}
}
这里是项目B的代码:
namespace WebApplication2
{
[Route("api/")]
public class TestController : Controller
{
private readonly IHttpClientFactory _clientFactory;
public TestController(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
[HttpGet]
[Route("TestGet")]
public async Task TestGet()
{
var request = new HttpRequestMessage(HttpMethod.Get,
string.Format("https://localhost:44345/api/Get"));
var client = _clientFactory.CreateClient();
client.Timeout = TimeSpan.FromSeconds(5);
var response = await client.SendAsync(request);
string Content = "";
if (response.IsSuccessStatusCode)
{
Content = await response.Content.ReadAsStringAsync();
Models.TestModel TestModel = new Models.TestModel();
TestModel = (Models.TestModel)JsonSerializer.Deserialize(Content, typeof(Models.TestModel));
}
}
}
}
他们都使用相同的模型:
public class TestModel
{
public string Success { get; set; } = "";
public string SuccessRemark { get; set; } = "";
}
现在的问题是项目 A 总是会生成 JSON 包含奇怪的字符 '\'。
比如右边的JSON就是
{"Success":"1","SuccessRemark":""}
结果会是这样:
"{\"Success\":\"1\",\"SuccessRemark\":\"\"}"
这个奇怪的字符'\'导致项目B无法正确反序列化。
我考虑过用替换的方法去掉字符'\'
我按照 Replacing backslash in a string 中的所有答案删除了字符“\”。同时,none 有效。
我知道另一种生成 json 的方法,没有奇怪的字符 '\':
[Produces("application/json")]
[HttpGet]
[Route("Get")]
public async Task<Models.TestModel> Get()
{
Models.TestModel TestModel = new Models.TestModel() { Success = "1" };
return TestModel;
}
嗯,这样只能return静态模型 while:
如果所有代码 运行 成功,我需要 return 一个成功模型。
如果代码 运行 有错误,我需要 return 一个错误模型。
这种方法不能解决这个问题。
你能帮帮我吗?谢谢。
试试这个
try
{
if (success)
return Json(new TestModel() { Success = "1" });
else
return Json(new TestModel() { Success = "0", SuccessRemark = "error" });
}
catch (Exception ex)
{
return Json(new TestModel() { Success = "0", SuccessRemark = ex.Message });
}