无法将多级JSON字符串转换为对象列表。有什么建议吗?

时间:2019-03-31 22:26:18

标签: c# json xamarin

嘿,这就是我希望返回的{\"status\":\"success\",\"locations\":[{\"id\":\"24\",\"name\":\"Test New Location Test\",\"contact_first_name\":\"Test\",\"contact_last_name\":\"Test\",\"contact_email\":\"test@email.com\",\"contact_phone_number\":\"(555) 555-5555\",\"billing_address\":\"Test\",\"billing_city\":\"Test\",\"billing_state\":\"AK\",\"billing_zip\":\"55555\",\"traps\":[]}]}

JSON字符串

我正在尝试存储构成对象列表位置的所有不同部分,例如ID,名称,contact_first_name等。我认为让我感到震惊的是前面的状态,这使它变得更多了。我很难进入不同的位置。

我正在按照本教程看似很清楚的内容,但还没有达到我的目的。 https://www.youtube.com/watch?v=XssLaKDRV4Y

以下代码是我的Service类的一部分,它用于获取预期的http响应(如上所述)并获取成功消息。当我取消注释时,应用程序下面的几行代码会中断,并且不会将任何对象存储到列表中。

public async Task<string> GetLocationData()
        {
            var user_id = Convert.ToString(App.Current.Properties["user_id"]);
            var session = Convert.ToString(App.Current.Properties["session"]);
            var key = "randomkeystring"; 

            var body = new List<KeyValuePair<string, string>>();
            body.Add(new KeyValuePair<string, string>("user_id", user_id));
            body.Add(new KeyValuePair<string, string>("session", session));
            body.Add(new KeyValuePair<string, string>("key", key));

            try
            {
                using (var client = new HttpClient())
                {
                    var request = new HttpRequestMessage(HttpMethod.Post, "apiurl/api/something") { Content = new FormUrlEncodedContent(body) };
                    var result = await client.SendAsync(request);
                    if (!result.IsSuccessStatusCode)
                    {
                        return "false";
                    }
                    //string representation
                    var stringResponseFromServer = await result.Content.ReadAsStringAsync();

                    //convert JSON to series of objects
                    //LocationCollection locationCollection = JsonConvert.DeserializeObject<LocationCollection>(stringResponseFromServer);
                    //System.Diagnostics.Debug.WriteLine(locationCollection.locations.Count);
                    var response = JsonConvert
                        .DeserializeObject<GetLocationDataResponse>(stringResponseFromServer);
                    if (response == null) return "false";

                    jsonString.HttpGetLocationDataString += stringResponseFromServer;

                    return stringResponseFromServer;
                }
            }
            catch
            {
                return "false";
            }
        }

我的locations.cs如下所示

 public class Locations
    {
        public int id { get; set; }
        public string name { get; set; }
        public string contact_first_name { get; set; }
        public string contact_last_name { get; set; }
        public string contact_email { get; set; }
        public string contact_phone_number { get; set; }
        public string billing_address { get; set; }
        public string billing_city { get; set; }
        public string billing_state { get; set; }
        public string billing_zip { get; set; }
        public string traps { get; set; }
    }

然后我有一个LocationCollection.cs,我希望在其中存储不同的位置,以便以后可以遍历它们,并对它们进行所需的操作。

public class LocationCollection
    {
        public List<Locations> locations { get; set; }
    }

然后我在用户登录后在MainPage上调用该方法

insectService.GetLocationData().ContinueWith(async (task) =>
            {
                var getLocationDataResponse = JsonConvert.DeserializeObject<GetLocationDataResponse>(task.Result);

                if (getLocationDataResponse.status == "failure")
                {
                    await DisplayAlert("Location Data Failure", "Could not retrieve data", "Try Again");

                    await Navigation.PushModalAsync(new LoginPage(), true);
                }
                //System.Diagnostics.Debug.WriteLine(getLocationDataResponse.locations.ToString());

                if (getLocationDataResponse.status == "success")
                {
                    await DisplayAlert("Location Data Success", "Successfully Recovered Data", "Back to Main Page");
                }
            }); //TaskScheduler.FromCurrentSynchronizationContext());

现在,我可以获取{\"status\":\"success\",\"locations\":[{\"id\":\"24\",\"name\":\"Test New Location Test\",\"contact_first_name\":\"Test\",\"contact_last_name\":\"Test\",\"contact_email\":\"test@email.com\",\"contact_phone_number\":\"(555) 555-5555\",\"billing_address\":\"Test\",\"billing_city\":\"Test\",\"billing_state\":\"AK\",\"billing_zip\":\"55555\",\"traps\":[]}]}的期望JSON字符串,并且可以检查状态是成功还是失败。但是,我无法将“位置”的不同部分存储到列表中。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试将api结果反序列化为结果模型,然后再从那里反序列化为位置模型。示例:

我的API模型

  public class ApiResult
{
    public Int32 Status { get; set; }
    public string Message { get; set; }
    public string Data { get; set; }
}

内部数据,我从API复制所有返回结果,然后反序列化为确切的模型。这是示例:

 public static List<Models.OrderList> RetrieveOrderList(string host, List<Models.FilterCondition> filter)
    {
        string sResult = HttpHelper.httpPost(host + "api/Order/RetrieveOrderList", Newtonsoft.Json.JsonConvert.SerializeObject(filter));
        Models.ApiResult mResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.ApiResult>(sResult);
        if (mResult.Status == 0)
            throw new Exception(mResult.Message);
        return Newtonsoft.Json.JsonConvert.DeserializeObject<List<Models.OrderList>>(mResult.Data);
    }

如果看到上面的我的返回结果(字符串),我将反序列化为API结果模型,然后再次最终反序列化为OrderList模型。希望这有助于您解决问题。

更新:API控制器 我忘了再提一点。在API控制器方面,您需要将结果复制到API模型。 这是示例

[HttpPost]
    public Models.ApiResult RetrieveOrderList(List<Models.FilterCondition> conditions)
    {
        Models.ApiResult mResult = new Models.ApiResult();
        try
        {
            List<Models.OrderList>mOrderList= BLL.Order.RetrieveOrderList(conditions);
            mResult.Status = 1;
            mResult.Message = "Success";
            mResult.Data = Newtonsoft.Json.JsonConvert.SerializeObject(mOrderList);
            return mResult;
        }
        catch (Exception ex)
        {
            mResult.Status = 0;
            mResult.Message = ex.Message;
            mResult.Data = "";
            return mResult;
        }
    }

答案 1 :(得分:0)

我的位置模型与JSON响应不匹配。在阅读了catch语句中的异常之后,我发现应该将“ traps”作为另一个列表。在将traps属性更改为List并为“ traps”创建另一个类之后,一切正常。