这是@Nkosi 翻译成 VB.Net 的答案。
我正在构建一个 WebAPI2 后端来支持 TourOfHeroes。
我想我有一个“重”对象并且我不想将所有属性返回到所有视图的情况。想象一下 Hero 有大约 30 列,我只需要 Heroes.component.ts 的 Id 和 Name ......
我不想另外创建一个对象来表示每个视图,以便我可以 JSON 序列化它们...干吗?
所以,这是@NKosi 发布的 2 个课程。不确定共享类是否必要,我只是按照@NKosi 编写的方式实现。
Imports System.Net.Http
Imports System.Web.Http
Imports System.Net
Imports System.Threading
Imports System.Threading.Tasks
Public Class JsonStringResultExtension
Public Shared Function JSONString(Controller As ApiController,
Optional jsonContent As String = "",
Optional statusCode As HttpStatusCode = HttpStatusCode.OK) As CustomJsonStringResult
Dim result As New CustomJsonStringResult(Controller.Request, statusCode, jsonContent)
Return result
End Function
End Class
Public Class CustomJsonStringResult
Implements IHttpActionResult
Private json As String
Private statusCode As HttpStatusCode
Private request As HttpRequestMessage
Public Sub New(httpRequestMessage As HttpRequestMessage, Optional statusCode As HttpStatusCode = HttpStatusCode.OK, Optional json As String = "")
Me.request = httpRequestMessage
Me.json = json
Me.statusCode = statusCode
End Sub
Public Function ExecuteAsync(cancellationToken As CancellationToken) As Task(Of HttpResponseMessage) Implements IHttpActionResult.ExecuteAsync
Return Task.FromResult(Execute())
End Function
Private Function Execute() As HttpResponseMessage
Dim response = request.CreateResponse(statusCode)
response.Content = New StringContent(json, Encoding.UTF8, "application/json")
Return response
End Function
End Class
我还将在 webApiConfig.vb 中添加以下内容,否则您将收到无法解析 HTML 的投诉
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New MediaTypeHeaderValue("text/html"))
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New MediaTypeHeaderValue("application/json"))
这是支持 heros.component.js 的 webAPI 控制器调用
就像@Luis Abreu 一样,我的 BO 已经在返回 JSON。我只想将格式正确的 JSON 作为字符串返回,而不是将我的 BO 映射到 API 中的另一个类,其唯一目的是对其进行序列化...
<HttpGet>
<Route("")>
Public Function GetAllHeroes() As CustomJsonStringResult
'populate a list of heros however you want
dim ag as new HeroAg()
Dim l As List(Of TOHbos.Hero) = ag.Items
'This should be shoved down into a reusable class...ListToJSON
Dim sb As New StringBuilder("")
Dim first As Boolean = True
sb.Append("[")
For Each h As TOHbos.Hero In l
If first = True Then
first = False
Else
sb.Append(", ")
End If
'decide which fields to include and generate a JSON document
h.decideWhichFieldsGetSerializedForThisView()
sb.Append(h.JSON)
Next
sb.Append("]")
Return JsonStringResultExtension.JSONString(Me, sb.ToString(), HttpStatusCode.OK)
End Function
我遇到的下一个问题是我从浏览器控制台中的 Angular 应用程序中收到此错误
Http failure during parsing for localhost:4300/api/heroes
使用 jsonLint.com,我发现我的 JSON 不太正确。我没有将键名放在双勾中,而是将值放在单勾中。虽然这可能是可接受的 JSON,但 jsonLint 抱怨,我猜 Angular rxjs 也是如此