首页 > 解决方案 > 将 JSON 对象反序列化为动态对象

问题描述

我有一个无法反序列化的 json 对象。json 对象来自Alpaca Markets api/snapshots。我正在使用 Refit,但能够创建一个类集来读取它,所以我已经直接读取了 json 对象,但无法使用 newtonsoft.json 库重新序列化它。这是json对象;

{
   "AAPL":{
      "latestTrade":{
         "t":"2021-09-17T20:25:51.020841773Z",
         "x":"V",
         "p":145.98,
         "s":100,
         "c":[
            "@",
            "T"
         ],
         "i":12505,
         "z":"C"
      },
      "latestQuote":{
         "t":"2021-09-17T20:00:43.70526836Z",
         "ax":"V",
         "ap":0,
         "as":0,
         "bx":"V",
         "bp":0,
         "bs":0,
         "c":[
            "R"
         ],
         "z":"C"
      },
      "minuteBar":{
         "t":"2021-09-17T20:25:00Z",
         "o":145.98,
         "h":145.98,
         "l":145.98,
         "c":145.98,
         "v":100,
         "n":1,
         "vw":145.98
      },
      "dailyBar":{
         "t":"2021-09-17T04:00:00Z",
         "o":148.75,
         "h":148.78,
         "l":145.765,
         "c":146.09,
         "v":1463230,
         "n":12487,
         "vw":146.742795
      },
      "prevDailyBar":{
         "t":"2021-09-16T04:00:00Z",
         "o":148.47,
         "h":148.95,
         "l":147.23,
         "c":148.78,
         "v":851556,
         "n":7523,
         "vw":148.174742
      }
   },
   "MSFT":{
      "latestTrade":{
         "t":"2021-09-17T20:00:58.520078539Z",
         "x":"V",
         "p":300.16,
         "s":100,
         "c":[
            "@",
            "T"
         ],
         "i":9410,
         "z":"C"
      },
      "latestQuote":{
         "t":"2021-09-17T20:00:00.000042133Z",
         "ax":"V",
         "ap":0,
         "as":0,
         "bx":"V",
         "bp":0,
         "bs":0,
         "c":[
            "R"
         ],
         "z":"C"
      },
      "minuteBar":{
         "t":"2021-09-17T20:00:00Z",
         "o":300.16,
         "h":300.16,
         "l":300.16,
         "c":300.16,
         "v":100,
         "n":1,
         "vw":300.16
      },
      "dailyBar":{
         "t":"2021-09-17T04:00:00Z",
         "o":304.245,
         "h":304.37,
         "l":299.59,
         "c":299.87,
         "v":570598,
         "n":9412,
         "vw":300.820404
      },
      "prevDailyBar":{
         "t":"2021-09-16T04:00:00Z",
         "o":303.84,
         "h":305.31,
         "l":300.82,
         "c":305.24,
         "v":386250,
         "n":6166,
         "vw":303.325332
      }
   }
}

标签: c#jsonjson.netrefit

解决方案


试试这个,它已经过测试并且工作正常(使用 newtonsoft.json 库)

var json=...your json string;

var jD = JsonConvert.DeserializeObject<Dictionary<string,Aapl>>(json);

json=JsonConvert.SerializeObject(jD);

输出

{"AAPL":{"latestTrade":{"t":"2021-09-17T20:25:51.0208418+00:00","x":"V","p":145.98,"s":100,"c":["@","T"],"i":12505,"z":"C"},"latestQuote":{"t":"2021-09-17T20:00:43.7052684+00:00","ax":"V","ap":0,"as":0,"bx":"V","bp":0,"bs":0,"c":["R"],"z":"C"},"minuteBar":{"t":"2021-09-17T20:25:00+00:00","o":145.98,"h":145.98,"l":145.98,"c":145.98,"v":100,"n":1,"vw":145.98},"dailyBar":{"t":"2021-09-17T04:00:00+00:00","o":148.75,"h":148.78,"l":145.765,"c":146.09,"v":1463230,"n":12487,"vw":146.742795},"prevDailyBar":{"t":"2021-09-16T04:00:00+00:00","o":148.47,"h":148.95,"l":147.23,"c":148.78,"v":851556,"n":7523,"vw":148.174742}},"MSFT":{"latestTrade":{"t":"2021-09-17T20:00:58.5200785+00:00","x":"V","p":300.16,"s":100,"c":["@","T"],"i":9410,"z":"C"},"latestQuote":{"t":"2021-09-17T20:00:00.0000421+00:00","ax":"V","ap":0,"as":0,"bx":"V","bp":0,"bs":0,"c":["R"],"z":"C"},"minuteBar":{"t":"2021-09-17T20:00:00+00:00","o":300.16,"h":300.16,"l":300.16,"c":300.16,"v":100,"n":1,"vw":300.16},"dailyBar":{"t":"2021-09-17T04:00:00+00:00","o":304.245,"h":304.37,"l":299.59,"c":299.87,"v":570598,"n":9412,"vw":300.820404},"prevDailyBar":{"t":"2021-09-16T04:00:00+00:00","o":303.84,"h":305.31,"l":300.82,"c":305.24,"v":386250,"n":6166,"vw":303.325332}}}

班级

    public partial class Aapl
    {
        [JsonProperty("latestTrade")]
        public LatestTrade LatestTrade { get; set; }

        [JsonProperty("latestQuote")]
        public LatestQuote LatestQuote { get; set; }

        [JsonProperty("minuteBar")]
        public Bar MinuteBar { get; set; }

        [JsonProperty("dailyBar")]
        public Bar DailyBar { get; set; }

        [JsonProperty("prevDailyBar")]
        public Bar PrevDailyBar { get; set; }
    }

    public partial class Bar
    {
        [JsonProperty("t")]
        public DateTimeOffset T { get; set; }

        [JsonProperty("o")]
        public double O { get; set; }

        [JsonProperty("h")]
        public double H { get; set; }

        [JsonProperty("l")]
        public double L { get; set; }

        [JsonProperty("c")]
        public double C { get; set; }

        [JsonProperty("v")]
        public long V { get; set; }

        [JsonProperty("n")]
        public long N { get; set; }

        [JsonProperty("vw")]
        public double Vw { get; set; }
    }

    public partial class LatestQuote
    {
        [JsonProperty("t")]
        public DateTimeOffset T { get; set; }

        [JsonProperty("ax")]
        public string Ax { get; set; }

        [JsonProperty("ap")]
        public long Ap { get; set; }

        [JsonProperty("as")]
        public long As { get; set; }

        [JsonProperty("bx")]
        public string Bx { get; set; }

        [JsonProperty("bp")]
        public long Bp { get; set; }

        [JsonProperty("bs")]
        public long Bs { get; set; }

        [JsonProperty("c")]
        public string[] C { get; set; }

        [JsonProperty("z")]
        public string Z { get; set; }
    }

    public partial class LatestTrade
    {
        [JsonProperty("t")]
        public DateTimeOffset T { get; set; }

        [JsonProperty("x")]
        public string X { get; set; }

        [JsonProperty("p")]
        public double P { get; set; }

        [JsonProperty("s")]
        public long S { get; set; }

        [JsonProperty("c")]
        public string[] C { get; set; }

        [JsonProperty("i")]
        public long I { get; set; }

        [JsonProperty("z")]
        public string Z { get; set; }
    }

推荐阅读