ServiceStack.文本反序列化字符串为单个对象空引用

本文关键字:对象 引用 单个 文本 反序列化 字符串 ServiceStack | 更新日期: 2023-09-27 17:53:49

我有以下代码。与JSON。NET它工作得很好,我可以反序列化字符串到CustomMaker对象。ServiceStack。文本得到null。我试过{get;设置;}以及删除和添加构造函数。

与JSON。它的工作方式就像JsonConvert.DeserializeObject(xString);

你知道为什么ServiceStack.Text不能工作吗?

    static void Main(string[] args) {
        string xString = "{'"error'":'"Invalid token 1 #556264'"}";
        Console.WriteLine(xString);
        CustomMaker xSLBM = TypeSerializer.DeserializeFromString<CustomMaker>(xString);
        Console.WriteLine(string.IsNullOrWhiteSpace(xSLBM.error) ? "error is null" : xSLBM.error);
        Console.ReadLine();
    }
    [Serializable]
    public class CustomMaker {
        public int UserID;
        public String error;
        public CustomMaker() { }
    }

编辑:这段代码也产生null:

    static void Main(string[] args) {
        JsConfig.IncludePublicFields = true;
        string xString = "{'"error'":'"Invalid token 1 #556264'"}";
        Console.WriteLine(xString);
        CustomMaker xSLBM = TypeSerializer.DeserializeFromString<CustomMaker>(xString);
        Console.WriteLine(string.IsNullOrWhiteSpace(xSLBM.error) ? "error is null" : xSLBM.error);
        Console.ReadLine();
    }
    [Serializable]
    public class CustomMaker {
        public CustomMaker() { }
        public int UserID { get; set; }
        public String error { get; set; }
    }

ServiceStack.文本反序列化字符串为单个对象空引用

默认情况下ServiceStack只序列化公共属性所以你可以重构你的DTO来包含属性,例如:

public class CustomMaker {
    public int UserID { get; set; }
    public String error { get; set; }
}

或者如果你想序列化公共字段,你可以这样指定:

JsConfig.IncludePublicFields = true;

您还需要使用JsonSerializer类,例如:

CustomMaker xSLBM = JsonSerializer.DeserializeFromString<CustomMaker>(xString);

string.ToJson()T.FromJson<T>(string)扩展方法,例如:

CustomMaker xSLBM = xString.FromJson<CustomMaker>();

TypeSerializer类仅用于序列化/反序列化JSV格式,而不是JSON。