构建json响应

本文关键字:响应 json 构建 | 更新日期: 2023-09-27 18:17:40

我正在开发一个用于监控多个服务器状态的自托管rest api。

我的任务是,当一切正常工作时,我应该只返回

{"response":"ok"}

但是,当查询的服务器上出现错误时,我必须返回

{  "response" :  [ {"agent":"<server>:<port>","port":"<port>" ,"Error":"<Description of the error>"} ]  }

我正在考虑构建一个helper类来在此模式上构建对象,并通过其余api返回它们

public class HelperErrorResponseClass
{
    public string agent { get; set; }
    public string port { get; set; }
    public string Error { get; set; }
}

这不是问题,问题是,当一切顺利时如何处理。我有这个Api响应助手类

public class Response
{
    public string response { get; set; }
}

但是我看到我需要将响应属性更改为List<HelperErrorResponseClass>以发送错误响应。你认为,如果我用Json字符串化List<HelperErrorResponseClass>对象。如果是这样,它会以期望的格式返回吗?

编辑:忘了添加,我正在使用Web Api来构建其余的服务。

UDPATE :

经过进一步研究,我找到了解决这个问题的方法。

写完这篇文章之后,我就可以像这样重写helper类了

[DataContract]
[KnownType(typeof(List<HelperErrorResponseClass>))]
public class Response
{
    [DataMember]
    public object response { get; set; }
}
[DataContract]
public class HelperErrorResponseClass
{
    [DataMember(EmitDefaultValue = false)]
    public string agent { get; set; }
    [DataMember(EmitDefaultValue = false)]
    public string port { get; set; }
    [DataMember(EmitDefaultValue = false)]
    public string error { get; set; }
}

这项工作是为了满足我和我的客户的需求…除了一件小事。当我从列表中得到结果时,并且考虑到我添加了KnownTypes指令,我的响应现在是这个

{"response":[{"__type":"HelperErrorResponseClass:#AppCommonLib","Error":"ERROR","InstanceId":"<InstanceId> : <Port>","PortType":"<PortType>"},{"__type":"HelperErrorResponseClass:#AppCommonLib","Error":"ERROR","InstanceId":"<InstanceId> : <Port>","PortType":"<PortType>"}]}

知道如何摆脱响应的__type属性吗?使它必须是明确的,只返回助手类的声明属性?

构建json响应

处理此问题的最简单方法是将处理函数的返回类型设置为string,然后可以检查错误并执行以下操作:

//pseudo code to give an idea
if (errorsList.Count() > 0)
{
     return JsonConvert.SerializeObject(errorsList);
}
else
{
     return JsonConvert.SerializeObject(new Response("ok"));
}

既然这么说…除非提供需求的人一点也不灵活,否则你应该重新设计。如果只是返回错误数组,调用API的人可以推断,如果它的长度是0,那么一切都工作正常。看起来很直接,对吧?你也可以把所有属性放在一个对象上这些字段会返回null或空字符串。或者您可以更改序列化器设置,以便在它们没有值时排除它们。

保持简单,使用匿名类型

if (condition) 
{
    return JsonConvert.SerializeObject(new { response = new { agent = "x", port = "y", error = "z" }});
}
else 
{
   return JsonConvert.SerializeObject(new { response = "ok"});  
}

更多信息:https://msdn.microsoft.com/en-us/library/bb397696.aspx

我个人认为你不需要Response类,特别是它是object类型。恕我直言,你把非常简单的问题复杂化了。它不仅是__type,还有其他信息,如HelperErrorResponseClass:#AppCommonLib,不应该在那里。

另一个问题是HelperErrorResponseClass类的名称不正确。这不是一个助手类。它是一个标准的数据对象类。

helper类是充满静态方法的类。它通常用来隔离一个"有用的"算法。

我是这样做的:

  1. 我会摆脱Response类。
  2. 我会使用您原来的简单HelperErrorResponseClass类,但将其重命名为更有意义的ErrorDetails
  3. 我会像这样返回响应:

.

if (errorsList.Count() > 0) {
    return JsonConvert.SerializeObject(new { response = errorsList});
}
else {
   return JsonConvert.SerializeObject(new { response = "ok"});
}

然而,如果你真的想坚持你的更新的解决方案,摆脱__type的一个简单的方法是简单地从最后的序列化字符串中删除它:

if (errorsList.Count() > 0) {
    string r = JsonConvert.SerializeObject(new { response = errorsList});
    return r.Replace("__type", "");
}
else {
   return JsonConvert.SerializeObject(new { response = "ok"});
}