构建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
属性吗?使它必须是明确的,只返回助手类的声明属性?
处理此问题的最简单方法是将处理函数的返回类型设置为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类是充满静态方法的类。它通常用来隔离一个"有用的"算法。
我是这样做的:
- 我会摆脱
Response
类。 - 我会使用您原来的简单
HelperErrorResponseClass
类,但将其重命名为更有意义的ErrorDetails
。 - 我会像这样返回响应:
.
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"});
}