【问题标题】:Convert JSON error result to String in vb.net在 vb.net 中将 JSON 错误结果转换为字符串
【发布时间】:2020-06-10 10:25:11
【问题描述】:

我有一个 vb.net 程序,它将 JSON 发布到 Web API 并返回一个结果。 当 API 返回错误时,我需要创建一个错误字符串以在程序中显示。 我正在使用 Newtonsoft.Json

返回的错误是。 {"message":"出现一个或多个输入异常。","errors":[{"message":"\"%fieldName\" 为必填项。输入后重试。","parameters":{"fieldName ":"name"}},{"message":"\"%fieldName\" 为必填项。输入并重试。","parameters":{"fieldName":"base64_encoded_data"}},{"message": "\"%fieldName\" 为必填项。输入并重试。","parameters":{"fieldName":"type"}}],"trace":"TraceMessageHasBeenDeleted {main}"}

我已经提取了消息

Dim responseFromAPI As HttpResponseMessage
    Dim rawResponseFromAPI As String
    Dim responseFromAPIStream As Stream
    Dim responseFromAPIReader As StreamReader
    Dim responseFromAPIObject As JObject

    ' Check Result
    If responseFromAPI.IsSuccessStatusCode = False Then
        ' Add Error to Error Collection
        responseFromAPIStream = Await responseFromAPI.Content.ReadAsStreamAsync()
        responseFromAPIReader = New StreamReader(responseFromAPIStream)
        rawResponseFromAPI = responseFromAPIReader.ReadToEnd()
        responseFromAPIObject = JObject.Parse(rawResponseFromAPI)

        ' Check for Message
        Console.WriteLine(responseFromAPIObject("message").ToString())
        CustomErrorCollection.AddError(responseFromAPIObject("message").ToString())
    End If

这将返回消息“发生了一个或多个输入异常。”

但我还需要从“错误”部分中提取所有“消息”,并将“%fieldName”替换为“fieldName”的参数

所以我正在寻找的最终结果是一个多行字符串。
" 发生了一个或多个输入异常。
名称是必需的。输入并重试。
base64_encoded_data 是必需的。输入并重试。
类型是必需的。输入并重试。”

可能有一种非常简单的方法可以实现这一点,但经过几个小时的搜索和试验,我一无所获。

非常感谢

【问题讨论】:

  • 您只返回对象的message 属性。使用您的调试器检查responseFromAPIObject,您应该会看到还有什么可用的。

标签: json vb.net json.net


【解决方案1】:

为了帮助导航反序列化的 Json,最好制作代表您的 json 属性的对象并反序列化为这些对象。

{
   "message":"One or more input exceptions have occurred.",
   "errors":[
      {
         "message":"\"%fieldName\" is required. Enter and try again.",
         "parameters":{
            "fieldName":"name"
         }
      },
      {
         "message":"\"%fieldName\" is required. Enter and try again.",
         "parameters":{
            "fieldName":"base64_encoded_data"
         }
      },
      {
         "message":"\"%fieldName\" is required. Enter and try again.",
         "parameters":{
            "fieldName":"type"
         }
      }
   ],
   "trace":"TraceMessageHasBeenDeleted {main}"
}

查看您的 json 示例,您有三 (3) 个主要属性 MessageErrorsTrace。您可以定义一个包含这些属性的对象并调用
JsonConvert.DeserializeObject(Of YourRepresentativeObject)(yourJsonString)

这看起来像:

Public Class ErrorResponse
    Public Property Message As String
    Public Property Errors As List(Of ErrorDefinition)
    Public Property Trace As String
End Class

Public Class ErrorDefinition
    Public Property Message As String
    Public Property Parameters As Parameter
End Class

Public Class Parameter
    Public Property FieldName As String
End Class

你要反序列化和使用的代码是:

Dim responseFromAPIObject = JsonConvert.DeserializeObject(Of ErrorResponse)(rawResponseFromAPI)

Dim builder As New StringBuilder()
builder.AppendLine(responseFromAPIObject.Message) 'Get the main message

For Each definition In responseFromAPIObject.Errors 'Get the error definitions
    'replace the placeholder with the parameter fieldName
    builder.AppendLine(definition.Message.Replace("%fieldName", definition.Parameters.FieldName))
Next

Console.WriteLine(builder.ToString)

最终输出:

One or more input exceptions have occurred.
"name" is required. Enter and try again.
"base64_encoded_data" is required. Enter and try again.
"type" is required. Enter and try again.

【讨论】:

  • 谢谢你。有助于理解。如何从每个“错误”中获取“fieldName”文本?即作为下一个错误的实际文本“fieldName”可能具有“response”参数 - As {“message”:“消费者无权访问%resources。”,“parameters”:{“resources”:“ Magento_Catalog::categories"}
  • 好吧,目前的模型没有考虑到这一点。您的参数模型需要一个资源属性。
猜你喜欢
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2020-04-15
  • 2021-09-15
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多