Trong một ứng dụng ASP.NET Web API, một số mô hình mà tôi đang làm việc có chứa một đoạn JSON đặc biệt chỉ hữu ích ở phía máy khách . Trên máy chủ, nó đơn giản đi vào và ra khỏi một cơ sở dữ liệu quan hệ dưới dạng một chuỗi. Hiệu suất là chìa khóa và có vẻ như vô nghĩa khi xử lý phía máy chủ chuỗi JSON.Json.NET - ngăn chặn tái tuần tự hóa một thuộc tính đã được tuần tự hóa
Vì vậy, trong C#, hãy tưởng tượng một đối tượng như thế này:
new Person
{
FirstName = "John",
LastName = "Smith",
Json = "{ \"Age\": 30 }"
};
Theo mặc định, Json.NET sẽ serialize đối tượng này như sau:
{
"FirstName": "John",
"LastName": "Smith",
"Json": "{ \"Age\": 30 }"
}
Tôi muốn để có thể hướng dẫn Json.NET giả định rằng thuộc tính Json
đã là một đại diện được tuần tự hóa, do đó nó không được sắp xếp lại và kết quả JSON sẽ giống như sau:
{
"FirstName": "John",
"LastName": "Smith",
"Json": {
"Age": 30
}
}
Lý tưởng nhất là hoạt động theo cả hai hướng, tức là khi POST biểu diễn JSON, nó sẽ tự động deserialize vào đại diện C# ở trên.
Cơ chế tốt nhất để đạt được điều này với Json.NET là gì? Tôi có cần tùy chỉnh JsonConverter
không? Có một cơ chế dựa trên thuộc tính đơn giản hơn không? Hiệu quả vấn đề; toàn bộ vấn đề là bỏ qua hàng loạt đầu vào, trong đó có thể là một chút tối ưu hóa vi mô, nhưng vì lợi ích của đối số, hãy giả sử là không. (Có khả năng sẽ có danh sách lớn với cồng kềnh Json
tính được trả lại.)
Nếu thuộc tính của bạn 'Json' là một chuỗi, thì nó sẽ được tuần tự hóa thành chuỗi. Tôi không hoàn toàn chắc chắn vấn đề là gì. Chỉ cần serialize nó như là một chuỗi, lưu trữ nó trong cơ sở dữ liệu của bạn như là một chuỗi và deserialize nó trở lại như là một chuỗi. –
Có lẽ tôi đã không giải thích rõ. Tôi đã thêm một mẫu JSON phụ để làm nổi bật sự khác biệt giữa những gì xảy ra theo mặc định và những gì tôi đang tìm kiếm để đạt được. –
Nếu mã phía máy chủ của bạn đang nhận chuỗi JSON từ đâu đó mà bạn có thể kiểm soát, bạn sẽ tốt hơn rất nhiều trong việc khắc phục vấn đề đó hơn là cố gắng tìm ra giải pháp cho vấn đề này. Tuy nhiên, nếu nó đến từ một cái gì đó mà bạn không có quyền truy cập vào, nỗ lực đầu tiên của tôi sẽ là deserialize nó khi bạn nhận được nó từ bất cứ nguồn nào bạn lấy nó từ. Điều đó có thể được thực hiện với một deserializer tùy chỉnh. Không có đủ thông tin để đưa ra giải pháp tốt nhất cho bạn. – krillgar