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