簡體   English   中英

JSON反序列化對象的對象列表始終為null

[英]JSON deserializeobject list of objects always null

我在將JSON字符串反序列化為具有1個字符串屬性和自定義對象列表的RootObject類時遇到問題。

當我調試應用程序並且代碼反序列化json時,在RootObject類中填充了“ ErrorCode”屬性“ test”,但“ meets”屬性始終為null

該代碼當前位於跨平台Xamarin表單應用程序中,但是我已經提取了代碼和類定義,並將它們運行在一個簡單的控制台應用程序中,該應用程序首次運行沒有任何問題。 我正在努力弄清楚自己在做什么錯。

我的簡單JSON對象如下:

{"meets": [
    {
      "VenueName": "O2"
    },
    {
      "VenueName": "wembly"
    },
    {
      "VenueName": "NEC"
    }
  ],
  "ErrorCode": "test"}

我的班級定義:

[JsonObject(Id = "Meets")]
public class Meets
{
    [JsonProperty(PropertyName = "VenueName")]
    public string VenueName { get; set; }
}

public class RootObject
{
    public List<Meets> Meets { get; set; }
    public string ErrorCode { get; set; }
}

擊中api並獲取json對象的代碼(已被清空,並在其位置放了一個較小的簡單對象):

using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Forms;
using EliteNfcBet.Models;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace EliteNfcBet.ViewModels
{
    public class ItemsViewModel : BaseViewModel
    {
        public ObservableCollection<Meets> RaceMeets { get; set; }
        public Command LoadItemsCommand { get; set; }

        public ItemsViewModel   ()
        {
            Title = "Select Meeting";
            RaceMeets = new ObservableCollection<Meets>();
            LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());                       
        }

        async Task ExecuteLoadItemsCommand()
        {
            if (IsBusy)
                return;

            IsBusy = true;

            try
            {
                RaceMeets.Clear();
                var result = await GetMeetingsAsync();
                //RaceMeets = result;
                //foreach (var meet in meets.Meets)
                //{
                //    RaceMeets.Add(meet);
                //}
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }

        public static async Task<RootObject> GetMeetingsAsync()
        {
            RootObject meet = new RootObject();
            //List<Meet> meets = new List<Meet>();
            HttpClient client = new HttpClient();
            client.MaxResponseContentBufferSize = 256000;

            var uri = new Uri(string.Format(Constants.RestUrl, string.Empty) + "/api/GetAvailablemeetings");

            try
            {
                var response = await client.GetAsync(uri);
                if (response.IsSuccessStatusCode)
                {
                    //var content = await response.Content.ReadAsStringAsync();
                    var content = "{\"meets\":[{\"VenueName\":\"O2\"},{\"VenueName\":\"wembly\"},{\"VenueName\":\"NEC\"}],\"ErrorCode\":\"test\"}";

                    if (!string.IsNullOrEmpty(content))
                    {

                        ITraceWriter traceWriter = new MemoryTraceWriter();

                        var settings = new JsonSerializerSettings
                        {
                            Error = (sender, args) =>
                            {
                                if (System.Diagnostics.Debugger.IsAttached)
                                {
                                    System.Diagnostics.Debugger.Break();
                                }
                            },
                            TraceWriter = traceWriter
                        };

                        //result = JsonConvert.DeserializeObject<T>(json, settings);
                        meet = JsonConvert.DeserializeObject<RootObject>(content, settings);
                        Console.WriteLine(traceWriter);
                    }

                    //if (meets.Count > 0)
                    //{
                    //    meet.MeetList = meets;
                    //}
                }
            }
            catch (Exception ex)
            {
                meet.ErrorCode = "INTERNAL_ERROR";
            }

            return meet;
        }
    }
}

編輯:

我對下面的內容做了一些建議。

我的Json字符串現在是這樣的:

"{\"Meets\":[{\"VenueName\":\"O2\"},{\"VenueName\":\"wembly\"},{\"VenueName\":\"NEC\"}],\"ErrorCode\":\"test\"}"

我的課在下面。 要注意的一件事是,它們是在進行反序列化的單獨代碼文件中的“模型”名稱空間中定義的。

namespace EliteNfcBet.Models
{
public class Meets
{
    public string VenueName { get; set; }
}

public class RootObject
{
    public List<Meets> Meets { get; set; }
    public string ErrorCode { get; set; }
}

}

同樣,在反序列化時,我再次調試了輸出,看起來它指向未找到Meets類成員的事實?

{2018-05-28T23:12:22.987 Info Started deserializing EliteNfcBet.Models.RootObject. Path 'Meets', line 1, position 9.
2018-05-28T23:12:22.993 Info Started deserializing System.Collections.Generic.List`1[[NInterpret.InterpretedObject, NInterpret.Xamarin.Droid, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. Path 'Meets', line 1, position 10.
2018-05-28T23:12:22.994 Info Started deserializing EliteNfcBet.Models.RootObject. Path 'Meets[0].VenueName', line 1, position 23.
2018-05-28T23:12:22.994 Verbose Could not find member 'VenueName' on EliteNfcBet.Models.RootObject. Path 'Meets[0].VenueName', line 1, position 23.
2018-05-28T23:12:22.994 Info Finished deserializing EliteNfcBet.Models.RootObject. Path 'Meets[0]', line 1, position 28.
2018-05-28T23:12:22.995 Info Started deserializing EliteNfcBet.Models.RootObject. Path 'Meets[1].VenueName', line 1, position 42.
2018-05-28T23:12:22.995 Verbose Could not find member 'VenueName' on EliteNfcBet.Models.RootObject. Path 'Meets[1].VenueName', line 1, position 42.
2018-05-28T23:12:22.996 Info Finished deserializing EliteNfcBet.Models.RootObject. Path 'Meets[1]', line 1, position 51.
2018-05-28T23:12:22.997 Info Started deserializing EliteNfcBet.Models.RootObject. Path 'Meets[2].VenueName', line 1, position 65.
2018-05-28T23:12:22.997 Verbose Could not find member 'VenueName' on EliteNfcBet.Models.RootObject. Path 'Meets[2].VenueName', line 1, position 65.
2018-05-28T23:12:22.997 Info Finished deserializing EliteNfcBet.Models.RootObject. Path 'Meets[2]', line 1, position 71.
2018-05-28T23:12:22.998 Info Finished deserializing System.Collections.Generic.List`1[[NInterpret.InterpretedObject, NInterpret.Xamarin.Droid, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. Path 'Meets', line 1, position 72.
2018-05-28T23:12:23.009 Info Finished deserializing EliteNfcBet.Models.RootObject. Path '', line 1, position 92.
2018-05-28T23:12:23.009 Verbose Deserialized JSON: 
{
  "Meets": [
    {
      "VenueName": "O2"
    },
    {
      "VenueName": "wembly"
    },
    {
      "VenueName": "NEC"
    }
  ],
  "ErrorCode": "test"
}}

編輯3:

我剛剛看過這篇文章,它解釋了很多! 似乎xamarin.forms當前在反射方面存在已知問題,因此某些軟件包可能無法正常工作。

JsonConvert.SerializeObject總是在XamarinForms中返回{}

是否有人對為什么會發生什么以及何時可以解決有任何見解。 我還可以實施一項變通辦法,以便可以使用調試。 謝謝。

{"meets": [
{
  "VenueName": "O2"
},
{
  "VenueName": "wembly"
},
{
  "VenueName": "NEC"
}  ],  
"ErrorCode": "test"}

您的問題是您在javascript中有一個名為“ meets”的對象,而在C#中的對象中有“ Meets”。 將其更改為“會議”,它應該可以工作。

我相信,您也不需要JsonObject屬性。 .NET應該能夠自動處理JSON的序列化:

public class Meets
{
    public string VenueName { get; set; }
}

public class RootObject
{
    public List<Meets> Meets { get; set; }
    public string ErrorCode { get; set; }
}

花一些時間查看這些資源以了解為什么會發生錯誤:

https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/

編輯

上面的類產生以下json:

Meets: 

{
  "VenueName": null
}

Root Object:

{
  "Meets": [
{
  "VenueName": null
}, 
{
  "VenueName": null
},
{
  "VenueName": null
}
],
  "ErrorCode": null
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM