【问题标题】:C# ServiceStack JsonSerializer DeserializeC# ServiceStack JsonSerializer 反序列化
【发布时间】: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 答案,可以帮助您stackoverflow.com/questions/7895105/…
  • 你发给我的链接不是和我一样吗?
  • 也许,我没有比较。但是这里的答案是对您的 SO 的正确答案。

标签: c# json servicestack jsonserializer


【解决方案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;

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 2011-10-31
    • 2013-06-23
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多