【问题标题】:stacked trying to deserialize a JSON response from an API with C#堆叠尝试使用 C# 反序列化来自 API 的 JSON 响应
【发布时间】:2020-05-18 02:20:29
【问题描述】:

我正在构建一个 C# 应用程序以从 Web API 获取数据。 它连接到网络服务器...获取有关股票市场、产品、价格和账户中剩余资金等的数据。我需要个性化所有这些信息,以便以后可以使用它来计算进出的最佳时机来自市场(买卖股票)。

在那小小的介绍之后,我被困在试图反序列化数据。

在向 API 发出一个 GET 请求后,我得到了这个 JSON:

{
  "cuentas": [
    {
      "numero": "xxxx",
      "tipo": "aaaa",
      "moneda": "bbbb",
      "disponible": 407397.92,
      "comprometido": 0.00,
      "saldo": 407397.92,
      "titulosValorizados": 0.0,
      "total": 407397.92000,
      "margenDescubierto": 0.0,
      "saldos": [
        {
          "liquidacion": "inmediato",
          "saldo": 407397.92,
          "comprometido": 0.00,
          "disponible": 407397.92,
          "disponibleOperar": 407397.92
        },
        {
          "liquidacion": "hrs24",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 407397.92
        },
        {
          "liquidacion": "hrs48",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 407397.92
        },
        {
          "liquidacion": "hrs72",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 407397.92
        },
        {
          "liquidacion": "masHrs72",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 0.0
        }
      ],
      "estado": "operable"
    },
    {
      "numero": "zzzz",
      "tipo": "ccccc",
      "moneda": "ddddd",
      "disponible": 4574.25,
      "comprometido": 0.00,
      "saldo": 4574.25,
      "titulosValorizados": 0.0,
      "total": 4574.25,
      "margenDescubierto": 0.0,
      "saldos": [
        {
          "liquidacion": "inmediato",
          "saldo": 4574.25,
          "comprometido": 0.00,
          "disponible": 4574.25,
          "disponibleOperar": 4574.25
        },
        {
          "liquidacion": "hrs24",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 4574.25
        },
        {
          "liquidacion": "hrs48",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 4574.25
        },
        {
          "liquidacion": "hrs72",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 4574.25
        },
        {
          "liquidacion": "masHrs72",
          "saldo": 0.00,
          "comprometido": 0.00,
          "disponible": 0.00,
          "disponibleOperar": 0.0
        }
      ],
      "estado": "operable"
    }
  ],
  "estadisticas": [
    {
      "descripcion": "Anterior",
      "cantidad": 27,
      "volumen": 1817447.95
    },
    {
      "descripcion": "Actual",
      "cantidad": 11,
      "volumen": 564217.96
    }
  ],
  "totalEnPesos": 699006.3575000000
}

到目前为止我做了什么:

1) 我使用网络应用程序将 JSON 数据转换为我需要的类。我有这个:

namespace QuickType
{
    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Lecturajson
    {
        [JsonProperty("cuentas")]
        public Cuenta[] Cuentas { get; set; }

        [JsonProperty("estadisticas")]
        public Estadistica[] Estadisticas { get; set; }

        [JsonProperty("totalEnPesos")]
        public double TotalEnPesos { get; set; }
    }

    public partial class Cuenta
    {
        [JsonProperty("numero")]
        public string Numero { get; set; }

        [JsonProperty("tipo")]
        public string Tipo { get; set; }

        [JsonProperty("moneda")]
        public string Moneda { get; set; }

        [JsonProperty("disponible")]
        public double Disponible { get; set; }

        [JsonProperty("comprometido")]
        public long Comprometido { get; set; }

        [JsonProperty("saldo")]
        public double Saldo { get; set; }

        [JsonProperty("titulosValorizados")]
        public long TitulosValorizados { get; set; }

        [JsonProperty("total")]
        public double Total { get; set; }

        [JsonProperty("margenDescubierto")]
        public long MargenDescubierto { get; set; }

        [JsonProperty("saldos")]
        public Saldo[] Saldos { get; set; }

        [JsonProperty("estado")]
        public string Estado { get; set; }
    }

    public partial class Saldo
    {
        [JsonProperty("liquidacion")]
        public string Liquidacion { get; set; }

        [JsonProperty("saldo")]
        public double SaldoSaldo { get; set; }

        [JsonProperty("comprometido")]
        public long Comprometido { get; set; }

        [JsonProperty("disponible")]
        public double Disponible { get; set; }

        [JsonProperty("disponibleOperar")]
        public double DisponibleOperar { get; set; }
    }

    public partial class Estadistica
    {
        [JsonProperty("descripcion")]
        public string Descripcion { get; set; }

        [JsonProperty("cantidad")]
        public long Cantidad { get; set; }

        [JsonProperty("volumen")]
        public double Volumen { get; set; }
    }
}

2) 我在想这样的事情:(让 JSON 正常工作的字符串“raw”)

IRestResponse responseestadocuenta = clientestadocuenta.Execute(requestestadocuenta);
raw = Convert.ToString(responseestadocuenta.Content);
var obj = JsonConvert.DeserializeObject<Lecturajson>(raw);

3) 没有 3。我被困在“2”中。

额外问题:这次我有 2 个帐户(如果您查看 JSON,则为西班牙语中的“cuentas”。它们是“numero”:“xxxx”和“numero”:“zzzz”。但下次用户如果他购买更多,可以获得更多帐户...所以 JSON 响应在他的一般结构中是固定的,但不是在“cuentas”的数量中(“numero”就像他们每个人的 ID)


这里是我的问题:

A) 所有这些数据将每秒左右刷新一次...目前还不确定,我认为处理所有这些东西的最佳方法是将其存储到 SQL DB 中。你觉得可以吗??请记住,这个 GET 请求只是我的应用程序中可用的 10 或 15 个其他类似请求中的 1 个......只是为了描绘它将处理的信息量。

B) 我需要一些关于“2”中的去色域化的帮助,以便它可以与我将所有这些都存储在 SQL DB 中的想法兼容。

******************************+

我愿意接受任何帮助、更正、想法和新的阅读内容。几周前我开始使用 C#,相信我,我无法相信我已经走了多远。如果我问的是新手问题,请原谅我。

非常感谢您的时间和耐心。

【问题讨论】:

  • 您可以粘贴原始响应示例吗?也许它被包装在 [ ] 中,在这种情况下,您需要将类包装在根对象 List 中,也在代码 raw2 和 raw 这些字符串中有什么区别?您正在反序列化 raw 但正在转换 raw2。
  • 对不起... raw2 实际上是原始的...在这里写问题的错误...在主要问题上发布的原始响应是真实的...
  • @kyndigs 我刚刚编辑了问题错误......谢谢......原始的它是我现在得到的实际响应。
  • 它会抛出异常吗?你可以添加 StackTrace
  • 我对你的问题 B 有点困惑。我知道你已经让 JSON 反序列化工作了?该对象以何种方式与 SQL 存储不“兼容”?顺便说一句,是的,如果您将来需要访问历史数据,我建议您将其作为一种方法。否则,也许只是将其缓存在文件中。

标签: c# json api deserialization json-deserialization


【解决方案1】:

类定义看起来不错。至于在类中获取 JSON 的代码,这是一个应该有帮助的示例

  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.GetAsync("http://<Your_API_Endpoint>");
  string responseBody = await response.Content.ReadAsStringAsync();
  var s = Newtonsoft.Json.JsonConvert.DeserializeObject<Lecturajson>(responseBody);

【讨论】:

    【解决方案2】:

    终于在你的帮助下做了这样的事情......

    var s = Newtonsoft.Json.JsonConvert.DeserializeObject<Lecturajson>(raw2);
    
    
                resultadoconsulta.Text =
                "******************** ESTADO DE CUENTA ********************" +
                "\nCuenta Nº: " + s.Cuentas[1].Numero +
                "\nTipo de Cuenta: " + s.Cuentas[1].Tipo +
                "\nMoneda: " + s.Cuentas[1].Moneda +
                "\nTotal en Pesos: " + s.TotalEnPesos;
    

    了解反序列化后如何处理数据...

    谢谢大家!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多