C# ServiceStack JsonSerializer 反序列化
Posted
技术标签:
【中文标题】C# ServiceStack JsonSerializer 反序列化【英文标题】:C# ServiceStack JsonSerializer Deserialize 【发布时间】:2016-10-21 21:08:11 【问题描述】:如何将字符串反序列化为 Json 对象,其中 json 对象可以是单个或数组,现在我有这个,它可以工作,但它是一个 hack(伪):
class MyObject
public string prop1
public string prop2;
class MyList
List<MyObject> objects get; set;
class Test
MyList list = JsonSerialzer.Deserialize<MyList>(str);
//if list is null - it can be single
if(list == null)
MyObject myObject = JsonSerializer.Deserialize<MyObject>(str);
if(myObject != null)
list.add(myObject);
如上所示,问题是我从另一个服务接收的 json 字符串可以是单个或列表。如何优雅地处理这个问题?
【问题讨论】:
问题更多在于您的 JSON 消息,属性应该始终是 1 个对象或数组。如果它是一个数组并且结果集只有一个结果,那么它仍然应该封装在一个数组中,这样你就不会遇到你遇到的问题。这是另一个排名靠前的 SO 答案,可以帮助您***.com/questions/7895105/… 你发给我的链接不是和我一样吗? 也许,我没有比较。但是这里的答案是对您的 SO 的正确答案。 【参考方案1】:我强烈建议不要在同一个参数中接受不同的结构,这会使您的软件变得非常脆弱和不可预测。但如果它可能是一个列表,您可以检查第一个字符是 [
,例如:
if (str.TrimStart().StartsWith("["))
MyList list = JsonSerialzer.Deserialize<MyList>(str);
else
MyObject myObject = JsonSerializer.Deserialize<MyObject>(str);
另外请注意,默认情况下,所有 ServiceStack 文本序列化器仅序列化 公共属性,因此您需要为每个要序列化的属性添加 getter/setter,例如:
class MyObject
public string prop1 get; set;
public string prop2 get; set;
class MyList
List<MyObject> objects get; set;
否则,您可以将 ServiceStack.Text 配置为也序列化 公共字段:
JsConfig.IncludePublicFields = true;
【讨论】:
以上是关于C# ServiceStack JsonSerializer 反序列化的主要内容,如果未能解决你的问题,请参考以下文章
C# ServiceStack JsonSerializer 反序列化
C# Redis分布式锁(基于ServiceStack.Redis)
ServiceStack.Redis 请求次数6000次异常