C#ServiceStack JsonSerializer反序列化

时间:2016-06-20 14:45:21

标签: c# json servicestack jsonserializer

如何将字符串反序列化为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字符串可以是单个也可以是列表。如何优雅地处理这个?

1 个答案:

答案 0 :(得分:3)

我强烈建议不要在同一论点中接受不同的结构,这会使你的软件变得非常脆弱和不可预测。但如果它可以是一个列表,你可以检查第一个字符是[,例如:

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;