C# ServiceStack JsonSerializer 反序列化
C# ServiceStack JsonSerializer Deserialize
如何将字符串反序列化为 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 我从其他服务接收到的字符串可以是单个字符串也可以是列表字符串。如何优雅地处理这个问题?
我强烈建议不要在同一个参数中接受不同的结构,这会使您的软件非常脆弱且不可预测。但是如果它可以是一个列表,你可以只检查第一个字符是 [
,例如:
if (str.TrimStart().StartsWith("["))
{
MyList list = JsonSerialzer.Deserialize<MyList>(str);
}
else
{
MyObject myObject = JsonSerializer.Deserialize<MyObject>(str);
}
另请注意,默认情况下所有 ServiceStack 文本序列化程序仅序列化 public 属性 ,因此您需要为每个 [=28= 添加 getters/setters ] 你想要序列化,例如:
class MyObject
{
public string prop1 { get; set; }
public string prop2 { get; set; }
}
class MyList
{
List<MyObject> objects { get; set; }
}
否则您可以配置 ServiceStack.Text 以同时序列化 public 字段 与:
JsConfig.IncludePublicFields = true;
如何将字符串反序列化为 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 我从其他服务接收到的字符串可以是单个字符串也可以是列表字符串。如何优雅地处理这个问题?
我强烈建议不要在同一个参数中接受不同的结构,这会使您的软件非常脆弱且不可预测。但是如果它可以是一个列表,你可以只检查第一个字符是 [
,例如:
if (str.TrimStart().StartsWith("["))
{
MyList list = JsonSerialzer.Deserialize<MyList>(str);
}
else
{
MyObject myObject = JsonSerializer.Deserialize<MyObject>(str);
}
另请注意,默认情况下所有 ServiceStack 文本序列化程序仅序列化 public 属性 ,因此您需要为每个 [=28= 添加 getters/setters ] 你想要序列化,例如:
class MyObject
{
public string prop1 { get; set; }
public string prop2 { get; set; }
}
class MyList
{
List<MyObject> objects { get; set; }
}
否则您可以配置 ServiceStack.Text 以同时序列化 public 字段 与:
JsConfig.IncludePublicFields = true;