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次异常

ServiceStack.Redis 请求次数6000次异常

C#序列化JSON数组而不使用类

如何修改 ServiceStack.OrmLite 生成的 SQL?