我有一个如下所示的模型和控制器
public class OrderModel
{
[JsonProperty("order_id")]
public string ID { get; set; }
[JsonProperty("delivery_shift")]
public string DeliveryShift { get; set; }
public string InvoiceType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
[HttpPost]
public IActionResult Index([FromBody] OrderModel order) {
return new JsonResult(new
{
order.ID,
order.DeliveryShift,
order.InvoiceType
});
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在正文中提交带有此 json 的 post 请求order_id并且delivery_shift不与模型映射时。
{"order_id": "OrderID", "delivery_shift": "evening", "InvoiceType": "DUE"}
Run Code Online (Sandbox Code Playgroud)
但是当我以这种格式提交 json 时它可以工作,但我需要以前的格式才能工作。
{"ID": "OrderID", "DeliveryShift": "evening", "InvoiceType": "DUE"} …Run Code Online (Sandbox Code Playgroud) 我真的受够了,但至少我想知道发生了什么事。开始了:
我的项目是一个 ASP.NET Core Web 应用程序,具有 Code First Entity Framework Core 和 Angular 前端。
我想控制何时加载引用的对象。它们可能很有用,但它们也可能在前端创建带有内部错误的循环引用。(JSON 将无限长。)
楷模:
class Book {
public virtual ICollection<Page> Pages { get; set; }
...simple properties
}
class Page {
public virtual Book Book { get; set; }
...simple properties
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,书籍中的每本书都会有一个空/空页面列表。
using (var context = new MoneyStatsContext())
{
var books = context.Books.Where(rule => rule.State == 1).ToList();
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,Pages列表不为 null,并且每个Page都会设置其Book属性。从而创建循环引用。
using (var context = new MoneyStatsContext()) …Run Code Online (Sandbox Code Playgroud) 在升级到 ASP.NET Core 5 的过程中,我们遇到了一种情况,需要JObject使用System.Text.Json. 如何以相当有效的方式完成此操作,而不需要将 JSON 重新序列化和重新解析为 aJsonDocument或通过 完全恢复回 Json.NET AddNewtonsoftJson()?
具体来说,假设我们有以下遗留数据模型:
public class Model
{
public JObject Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我们从 ASP.NET Core 5.0 返回此值时,“value”属性的内容被破坏成一系列空数组。例如:
var inputJson = @"{""value"":[[null,true,false,1010101,1010101.10101,""hello"","""",""\uD867\uDE3D"",""2009-02-15T00:00:00Z"",""\uD867\uDE3D\u0022\\/\b\f\n\r\t\u0121""]]}";
var model = new Model { Data = JObject.Parse(inputJson) };
var outputJson = JsonSerializer.Serialize(model);
Console.WriteLine(outputJson);
Assert.IsTrue(JToken.DeepEquals(JToken.Parse(inputJson), JToken.Parse(outputJson)[nameof(Model.Data)]));
Run Code Online (Sandbox Code Playgroud)
失败,并生成以下错误的 JSON:
public class Model
{
public JObject Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何正确序列化JObject属性System.Text.Json?请注意, 可能JObject相当大,因此我们更愿意将其流式传输,而不是将其格式化为字符串并从头开始再次将其解析为 …
我有一个对象列表 as IEnumerable<IHit<Header>>,但 .NET Core 3.0 没有发出所有信息
这是当我返回列表的单个对象 IHit 时 obj.ElementAt(0)
{"explanation":null,"fields":null,"highlight":{},"id":"123","index":"ky","innerHits":{},"matchedQueries":[], "nested":null, "primaryTerm":null, "routing":null, "score":10.98915, "sequenceNumber":null, "sorts":[],"source":{"timeStamp":"2019-05 -16T06:16:07Z", "result":"PASS","testTimeStart":"20190516141559","testTimeEnd":"20190516141607","barcode":"XXRX8762"},"type":"_doc","版本":0}
但是当我返回列表本身时:
[{"explanation":null,"fields":null,"highlight":{},"innerHits":{},"matchedQueries":[],"nested":null,"score":10.98915,"sorts" :[]}]
也当我尝试明确调用 JsonSerializer
string s = JsonSerializer.Serialize(result, typeof(IEnumerable<IHit<Header>>), obj);
Run Code Online (Sandbox Code Playgroud)
总结:
的WebAPI工作正常,返回如果正确序列化对象劲儿对象:
public IHit<Header> Get(string id)
但是当一个列表时,则不是。
public IEnumerable<IHit<Header>> GetAll()
Run Code Online (Sandbox Code Playgroud)
我试过了IEnumerable, IList, List,结果都是一样的!
这些是我的类型:
[<DataContract>]
type AreaCodeSingleResponse =
{ [<field:DataMember(Name = "id")>]
Id : string
[<field:DataMember(Name = "code")>]
Code : string
[<field:DataMember(Name = "name")>]
Name : string }
[<DataContract>]
type AreaCodeListResponse =
{
[<field:DataMember(Name = "areacode_list")>]
AreaCodeList : List<AreaCodeSingleResponse> }
Run Code Online (Sandbox Code Playgroud)
这是数据示例:
{
"areacode_list": [
{
"id": "00447",
"code": "07",
"name": "UK Mobile",
"order_column": "_00447"
},
{
"id": "0044113",
"code": "0113",
"name": "Leeds",
"order_column": "0044113"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是反序列化代码,这里调用的是传入类型AreaCodeListResponse:
member __.ReturnDataToType<'T>() =
__.ReturnData
|> JsonConvert.DeserializeObject<'T>
Run Code Online (Sandbox Code Playgroud)
在我升级到 DotNet6 之前,这工作正常并返回数据列表。之后,它失败并返回一个空列表。没有抛出任何错误,但列表为空。
对于我使用类和其他类型进行反序列化的所有其他调用来说,这都是失败的。
有什么变化需要我注意吗?我不是 F# 专家,只是在处理一些遗留代码时才开始使用它。
我有一个带有控制器的 ASP.NET Core 2.2 项目,其 GET 方法返回一个包含System.IO.FileInfo属性的对象。当我调用 API 时(例如在 Web 浏览器中),它返回一个不完整的 JSON 字符串。
这是实例正在序列化的类:
public class Thing
{
public string Name { get; set; }
public FileInfo File { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是控制器、程序和启动类:
[Route("Test/Home")]
[ApiController]
public class HomeController : Controller
{
[HttpGet]
public async Task<ActionResult<Thing>> GetThing()
{
return new Thing()
{
Name = "First thing",
File = new FileInfo("c:\file.txt")
};
}
}
public class Program
{
public static async Task Main(string[] args)
=> await CreateWebHostBuilder(args).Build().RunAsync();
public static …Run Code Online (Sandbox Code Playgroud) 我通常ShouldSerialize用来排除没有数据的属性,例如数组,但现在,当我只在.NET Core 3. 它在使用时被触发,NewtonSoft但我已将它从我的项目中删除,因为它似乎不再需要。
例如:
private ICollection<UserDto> _users;
public ICollection<UserDto> Users
{
get => this._users ?? (this._users = new HashSet<UserDto>());
set => this._users = value;
}
public bool ShouldSerializeUsers()
{
return this._users?.Count > 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么没有触发 ShouldSerializeUsers 的任何想法?
我已经看到其他可以使用的答案:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.NullValueHandling =
NullValueHandling.Ignore;
});
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有另一种方法来处理这个问题,因为我没有使用 .AddMvc
谢谢。
在ASP.NET Core 3.0 Web API项目中,如何指定System.Text.Json序列化选项以自动将Pascal Case属性序列化/反序列化为Camel Case,反之亦然?
给定具有Pascal Case属性的模型,例如:
public class Person
{
public string Firstname { get; set; }
public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及使用System.Text.Json将JSON字符串反序列化为Person类类型的代码:
var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);
Run Code Online (Sandbox Code Playgroud)
除非将JsonPropertyName与以下每个属性一起使用,否则不会成功反序列化:
public class Person
{
[JsonPropertyName("firstname")
public string Firstname { get; set; }
[JsonPropertyName("lastname")
public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在中尝试了以下方法startup.cs,但在仍然需要方面没有帮助JsonPropertyName:
services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.PropertyNamingPolicy = …Run Code Online (Sandbox Code Playgroud) c# ×7
json ×6
asp.net-core ×4
json.net ×3
.net-core ×2
.net ×1
.net-6.0 ×1
asp.net ×1
asp.net-mvc ×1
f# ×1