StreamReader 和 JsonTextReader 的反序列化不起作用

Posted

技术标签:

【中文标题】StreamReader 和 JsonTextReader 的反序列化不起作用【英文标题】:Deserializetion with StreamReader and JsonTextReader not working 【发布时间】:2020-11-25 13:35:33 【问题描述】:

我正忙于编写反序列化方法,但反序列化的对象没有填充任何值。我正在测试类中测试方法的核心。

    [TestMethod]
    public void DeserializeObject_WithReader()
    
        string json = "\"objectName\":\"joe\",\"objectAge\":30,\"objectDimensionX\":148.25,\"objectDimensionY\":95.87";

        using (StringReader reader = new StringReader(json))
        
            using (JsonTextReader jsonReader = new JsonTextReader(reader))
            
                JsonSerializer ser = JsonSerializer.CreateDefault();
                var t = ser.Deserialize<SerializedObjectTestClass>(jsonReader);
            
        
    

这是我要填充的测试类

public class SerializedObjectTestClass

    private string ObjectName  get; set; 
    private int ObjectAge  get; set; 
    private decimal ObjectDimensionX  get; set; 
    private decimal ObjectDimensionY  get; set; 

【问题讨论】:

【参考方案1】:

Newtonsoft Json.NET 默认情况下不会序列化/反序列化私有属性,因此您需要将它们公开,或者使用JsonPropertyAttribute 标记:

public class SerializedObjectTestClass

    public string ObjectName  get; set; 
    ....

或者:

public class SerializedObjectTestClass

    [JsonProperty]
    private string ObjectName  get; set; 
    ....

【讨论】:

【参考方案2】:

您可以一次反序列化整个对象:

SerializedObjectTestClass obj = JsonConvert.DeserializeObject<SerializedObjectTestClass>(json);

接下来的事情是 newtonsoft 的属性必须是公开的:

 public class SerializedObjectTestClass
 
     public string ObjectName  get; set; 
     public int ObjectAge  get; set; 
     public decimal ObjectDimensionX  get; set; 
     public decimal ObjectDimensionY  get; set; 

您也可以在属性上方添加属性:

[JsonProperty]
    private string Property get; set; 

【讨论】:

以上是关于StreamReader 和 JsonTextReader 的反序列化不起作用的主要内容,如果未能解决你的问题,请参考以下文章

StreamReader 和寻找

HTTPWebResponse + StreamReader 非常慢

StreamReader和StreamWriter中文乱码问题

StreamReader和StreamWriter说明

StreamReader类

StreamReader 和可移植类库