Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSONConvertor反序列化时自动选择参数化构造函数_C#_Json_Json.net - Fatal编程技术网

C# JSONConvertor反序列化时自动选择参数化构造函数

C# JSONConvertor反序列化时自动选择参数化构造函数,c#,json,json.net,C#,Json,Json.net,我使用json.NET将json字符串反序列化到模型中。 下面是我想要达到的目标,请告诉我什么是最好的方法 当没有数据时,我的回答如下所示 json字符串=“{\“message\”:\“SUCCESS\”,\“result\”:null}” 结果最终与一个视图相关联。因此,当响应为null时,我希望使用默认模型值初始化视图。所以我想在反序列化时调用默认构造函数。默认构造函数如下所示 public ProfileModel() { this.DefaultTab

我使用json.NET将json字符串反序列化到模型中。 下面是我想要达到的目标,请告诉我什么是最好的方法

当没有数据时,我的回答如下所示
json字符串=“{\“message\”:\“SUCCESS\”,\“result\”:null}”

结果最终与一个视图相关联。因此,当响应为null时,我希望使用默认模型值初始化视图。所以我想在反序列化时调用默认构造函数。默认构造函数如下所示

    public ProfileModel()
    {
        this.DefaultTab = DefaultTabOption.PROFILE;
        this.DataLoadPosition = new DataLoadPositionOptionsModel();
        this.DataLayout = new DataLayoutOptionsModel();
        this.NAData = new NADataOptionsModel();
        this.DataTable = new DataDisplayOptionsModel();
    }
{"message":"SUCCESS","result":{"dataLayout":{"vertical":false},"dataLoadPosition":{"cell":"B2","cursorLocation":false},"dataTable":{"decimalPts":1},"defaultTab":"BROWSE","naData":{"custom":"","naDataOption":"FORWARDFILL"}}}
但当有数据时,响应如下所示

    public ProfileModel()
    {
        this.DefaultTab = DefaultTabOption.PROFILE;
        this.DataLoadPosition = new DataLoadPositionOptionsModel();
        this.DataLayout = new DataLayoutOptionsModel();
        this.NAData = new NADataOptionsModel();
        this.DataTable = new DataDisplayOptionsModel();
    }
{"message":"SUCCESS","result":{"dataLayout":{"vertical":false},"dataLoadPosition":{"cell":"B2","cursorLocation":false},"dataTable":{"decimalPts":1},"defaultTab":"BROWSE","naData":{"custom":"","naDataOption":"FORWARDFILL"}}}
在本例中,我希望调用参数化构造函数,以便正确初始化模型

反序列化代码:

        using (StreamReader reader = new StreamReader(responseStream))
        {
           var t = JsonConvert.DeserializeObject<T>(reader.ReadToEnd());                
           return t;
        }

反序列化的最佳方式是什么,以便在null时调用默认构造函数,在非null时调用参数化构造函数。我尝试了
ConstructorHandling
NullValueHandling
,但未能达到预期效果

我简化了你的模型

public sealed class ProfileModel
{
    public ProfileModel()
    {
        DataLayout = new DataLayoutOptionsModel();
    }

    public ProfileModel(DataLayoutOptionsModel dataLayout)
    {
        DataLayout = dataLayout;
    }

    public DataLayoutOptionsModel DataLayout { get; private set; }
}

public sealed class DataLayoutOptionsModel
{
    public bool Vertical { get; set; }
}

public class ResultModel
{
    public string Message { get; set; }
    public ProfileModel Result { get; set; }
}
例如,要选择具体的构造函数,您必须实现定制的
JsonConverter

public sealed class MyJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(ProfileModel).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader,
        Type objectType,
        object existingValue,
        JsonSerializer serializer)
    {
        ProfileModel target;
        JObject jObject = JObject.Load(reader);

        JToken resultToken = jObject["Result"];
        //This is result null check
        if (resultToken.Type == JTokenType.Null)
        {
            target = new ProfileModel();
        }
        else
        {
            var optionsModel = resultToken["DataLayout"].ToObject<DataLayoutOptionsModel>();
            target = new ProfileModel(optionsModel);
        }

        serializer.Populate(jObject.CreateReader(), target);
        return target;
    }

    public override void WriteJson(JsonWriter writer,
        object value,
        JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
公共密封类MyJsonConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回typeof(ProfileModel).IsAssignableFrom(objectType);
}
公共重写对象ReadJson(JsonReader,
类型objectType,
对象现有值,
JsonSerializer(序列化程序)
{
模型目标;
JObject=JObject.Load(读卡器);
JToken resultToken=jObject[“结果”];
//这是结果空检查
if(resultToken.Type==JTokenType.Null)
{
target=newprofilemodel();
}
其他的
{
var optionsModel=resultToken[“DataLayout”].ToObject();
目标=新配置文件模型(选项模型);
}
填充(jObject.CreateReader(),目标);
回报目标;
}
public override void WriteJson(JsonWriter writer,
对象值,
JsonSerializer(序列化程序)
{
抛出新的NotImplementedException();
}
}
因此,结果序列化如下所示:

[Fact]
public void Test()
{
    string tinyJsonl = "{\"Message\":\"SUCCESS\",\"Result\":null}";
    var defaultProfile = JsonConvert.DeserializeObject<ProfileModel>(tinyJsonl, new MyJsonConverter());
    Assert.False(defaultProfile.DataLayout.Vertical);

    string fullJson = "{\"Message\":\"SUCCESS\",\"Result\":{\"DataLayout\":{\"Vertical\":true}}}";
    var customProfile = JsonConvert.DeserializeObject<ProfileModel>(fullJson, new MyJsonConverter());
    Assert.True(customProfile.DataLayout.Vertical);
}
[事实]
公开无效测试()
{
字符串tinyJsonl=“{\”消息\“:\”成功\“,\”结果\“:空}”;
var defaultProfile=JsonConvert.DeserializeObject(tinyJsonl,new MyJsonConverter());
False(defaultProfile.DataLayout.Vertical);
字符串fullJson=“{\'Message\':\'SUCCESS\',\'Result\':{\'DataLayout\':{\'Vertical\':true}}}”;
var customProfile=JsonConvert.DeserializeObject(fullJson,new MyJsonConverter());
True(customProfile.DataLayout.Vertical);
}