为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
千巷猫影 2022-11-21 15:56:19
大家好,这是我期待返回的 JSON 字符串{\"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\":[]}]}我正在尝试将构成位置的所有不同部分存储到对象列表中,例如 id、name、contact_first_name 等。我认为让我感到困惑的是前面的状态,这让我变得有点困难访问不同的位置。我正在按照本教程进行操作,它看起来很清楚,但还没有让它在我这边工作。https://www.youtube.com/watch?v=XssLaKDRV4Y下面的代码是我的服务类的一部分,它用于获取预期的 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));然后我有一个 LocationCollection.cs,我希望在其中存储不同的位置,这样我以后可以遍历它们并对它们做任何我需要做的事情。现在我能够获得预期的 JSON 字符串,{\"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\":[]}]}并且能够检查状态是成功还是失败。但是,我无法将“位置”的不同部分存储到列表中。有什么建议么?
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您可以尝试将 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);

    }

如果你看到上面的 My return result(string),我反序列化为 API result Model,最后再次反序列化为 OrderList Model。希望这有助于解决您的问题。


更新: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;

        }

    }


查看完整回答
反对 回复 2022-11-21
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我的位置模型与 JSON 响应不匹配。一旦我读到我的 catch 语句中的异常是什么,我就看到“陷阱”应该是另一个列表。在我将 traps 属性更改为 List 然后为“陷阱”创建另一个类后,一切正常。



查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信