将对象数组反序列化为c#class在Xamarin.Forms App中返回null

时间:2018-02-22 12:58:38

标签: c# list json-deserialization

我的应用程序中有这个课程:

public class Control
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ControlDescription { get; set; }
    public string ControlExceptionText { get; set; }
    public string Color { get; set; }
    public double DataRetrieving_Frequency { get; set; }
    public double delay_Factor { get; set; }
    public Boolean Disabled { get; set; }
}

我的json字符串是:

var result = 
"[
{\"id\":16,\"name\":\"trest\",\"controlDescription\":null,\"controlExceptionText\":null,\"color\":\"#abdb2c\",\"dataRetrieving_Frequency\":0.0,\"delay_Factor\":0.0,\"disabled\":false},
{\"id\":15,\"name\":\"test\",\"controlDescription\":null,\"controlExceptionText\":null,\"color\":\"#441fed\",\"dataRetrieving_Frequency\":1440.0,\"delay_Factor\":10.0,\"disabled\":false},
{\"id\":14,\"name\":\"Powershell\",\"controlDescription\":\"text. \",\"controlExceptionText\":\"exception.\",\"color\":\"#ad89d7\",\"dataRetrieving_Frequency\":1440.0,\"delay_Factor\":10.0,\"disabled\":false}
]"

我希望将此json反序列化以适合我的Control class。所以我这样做:

List<Control> test = JsonConvert.DeserializeObject<List<Control>>(result);

问题是test会返回null

有什么想法吗?!

更新

  • 此代码在我的其他应用中运行良好,但不适用于Xamarin.Form app。
  • 还尝试将@附加到JSON字符串的开头但是出现此错误
  

解析值@时遇到意外的字符。

更新

我正在使用Xamarin Live Player查看我的应用程序,也许问题与此有关,因为许多开发人员都在抱怨在使用Live Player时序列化和反序列化错误。

3 个答案:

答案 0 :(得分:0)

您的json字符串不正确。

  

JSON数据被写为名称/值对。

     

名称/值对由字段名称(双引号)组成,   然后是冒号,后跟一个值:"name":"John"

从json字符串中删除反斜杠。对于将来,您可以检查json字符串here

的正确性

答案 1 :(得分:0)

反序列化适用于此字符串格式:enter image description here

所以回答你的问题:你需要一个有效的JSON字符串来进行反序列化。从顶部的@开始,将所有\"替换为双引号。

更新编辑:@符号应该在字符串之外,它不是JSON字符串的一部分,它只是一个指示您的字符串将是多行的。

答案 2 :(得分:0)

这对我来说很好。到目前为止,这是我尝试过的另一个示例,没有进行反序列化。 我收到一个JSON文件作为响应。我的JSON看起来像这样。

enter image description here

enter image description here

..我这样做是为了从JSON中获取每个元素。而且我已经将这些元素适合猴子列表。

using (JsonDocument document = JsonDocument.Parse(response, options))
            {
                Grid grid = new Grid();
                Monkeys = new List<Monkey>();
                foreach (JsonElement element in document.RootElement.EnumerateArray())
                {
                    if (element.TryGetProperty("id", out JsonElement id)&&(element.TryGetProperty("end", out JsonElement end) )
                        && (element.TryGetProperty("time", out JsonElement time) && (element.TryGetProperty("description", out JsonElement description)
                        && (element.TryGetProperty("start", out JsonElement start) && (element.TryGetProperty("date", out JsonElement date))))))
                    {    
                        Monkeys.Add(new Monkey
                        {
                            Time=time.ToString(),
                            Start = start.ToString(),
                            End =end.ToString(),
                            Description = description.ToString()
                        });
                        BindingContext = this;
                    }
                }
            }

这是我的猴子课

public class Monkey
    {
        public string Time { get; set; }
        public string Start { get; set; }
        public string End { get; set; }
        public string Description { get; set; }
        public string ImageUrl { get; set; }

        public override string ToString()
        {
            return Start;
        }
    }