Десериализация с StreamReader и JsonTextReader не работает - PullRequest
4 голосов
/ 05 августа 2020

Я занят написанием метода десериализации, но десериализованный объект не заполнен никакими значениями. Я тестирую ядро ​​метода в тестовом классе.

    [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; }
}

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Newtonsoft Json. NET не сериализует / десериализует частные свойства по умолчанию, поэтому вам нужно либо сделать их опубликованными c, либо пометить JsonPropertyAttribute:

public class SerializedObjectTestClass
{
    public string ObjectName { get; set; }
    ....
}

Или:

public class SerializedObjectTestClass
{
    [JsonProperty]
    private string ObjectName { get; set; }
    ....
}
1 голос
/ 05 августа 2020

Вы можете десериализовать весь объект сразу:

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

Следующее, что для newtonsoft свойства должны быть опубликованы c:

 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; }
...