Значения Api Json 0 или false

#c# #json #parsing #console-application

#c# #json #синтаксический анализ #консольное приложение

Вопрос:

Я использую веб-JSON api для ввода некоторых значений из игрового рынка в объекты c #. Я довольно новичок в c # и раньше не работал с API.

Вот мой код:

 using System;
using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;

namespace HttpsApiTest
{
    class Program
    {

        public class ForQuery
        {
            public static bool bid { get; set; }
            public static List<int> types { get; set; }
            public static List<object> regions { get; set; }
            public static List<object> systems { get; set; }
            public static int hours { get; set; }
            public static int minq { get; set; }
        }

        public class Buy
        {
            public static ForQuery forQuery { get; set; }
            public static long volume { get; set; }
            public static double wavg { get; set; }
            public static double avg { get; set; }
            public static double variance { get; set; }
            public static double stdDev { get; set; }
            public static double median { get; set; }
            public static double fivePercent { get; set; }
            public static double max { get; set; }
            public static double min { get; set; }
            public static bool highToLow { get; set; }
            public static long generated { get; set; }
        }

        public class ForQuery2
        {
            public static bool bid { get; set; }
            public static List<int> types { get; set; }
            public static List<object> regions { get; set; }
            public static List<object> systems { get; set; }
            public static int hours { get; set; }
            public static int minq { get; set; }
        }

        public class Sell
        {
            public ForQuery2 forQuery { get; set; }
            public static int volume { get; set; }
            public static double wavg { get; set; }
            public static double avg { get; set; }
            public static double variance { get; set; }
            public static double stdDev { get; set; }
            public static double median { get; set; }
            public static double fivePercent { get; set; }
            public static double max { get; set; }
            public static double min { get; set; }
            public static bool highToLow { get; set; }
            public static long generated { get; set; }
        }

        public class RootObject
        {
            public Buy buy { get; set; }
            public Sell sell { get; set; }
        }

        static void Main(string[] args)
        {
            string sURL = "https://api.evemarketer.com/ec/marketstat/json?typeid=1230amp;regionlimit=10000002";
            StreamReader objReader = new StreamReader(WebRequest.Create(sURL).GetResponse().GetResponseStream());
            string sLine = objReader.ReadLine();

            JToken.Parse(sLine.Replace("[", "").Replace("]", "")).ToObject<RootObject>();

            Console.WriteLine(Buy.max);
            Console.WriteLine(Buy.highToLow);

            Console.ReadLine();
        }
    }
}
  

и веб-api JSON выводит это:

 [
  {
    "buy": {
      "forQuery": {
        "bid": true,
        "types": [
          1230
        ],
        "regions": [],
        "systems": [],
        "hours": 24,
        "minq": 1
      },
      "volume": 5544790080,
      "wavg": 11.43,
      "avg": 10.86,
      "variance": 4.38,
      "stdDev": 2.09,
      "median": 12,
      "fivePercent": 13.75,
      "max": 20,
      "min": 5,
      "highToLow": true,
      "generated": 1551926105235
    },
    "sell": {
      "forQuery": {
        "bid": false,
        "types": [
          1230
        ],
        "regions": [],
        "systems": [],
        "hours": 24,
        "minq": 1
      },
      "volume": 258207299,
      "wavg": 16.8,
      "avg": 20.21,
      "variance": 132.71,
      "stdDev": 11.52,
      "median": 15.99,
      "fivePercent": 12.92,
      "max": 60,
      "min": 6,
      "highToLow": false,
      "generated": 1551926105235
    }
  }
]
  

Я не уверен, почему Console.WriteLine(Buy.max); отображается как 0 вместо 20 и Console.WriteLine(Buy.highToLow); отображается как false вместо true. что я делаю не так? Я искал решения этой проблемы в течение последних нескольких часов, но безрезультатно. Любая помощь была бы высоко оценена!

Комментарии:

1. Почему все ваши свойства статичны? Попробуйте удалить static из свойств.

2. Почему вы пытаетесь удалить фрагменты JSON. Не делайте этого. Это допустимый JSON. Прочитайте поток до конца, десериализуйте до более простой структуры класса. Ваши Buy и Sell классы идентичны, как и ForQuery класс. У вас может быть только один тип каждого из них. Вы могли бы просто использовать имена свойств (Buy и Sell), чтобы отличить два объекта. Вот и все.

3. Кроме того, вы можете использовать атрибут [JsonProperty("[OriginalPropertyName]")] , если вам нужно изменить имя свойства.

4. Я использовал static, потому что способ настройки моего кода выдавал ошибку, в которой говорилось, что он не может использовать нестатическое значение.

Ответ №1:

Что они сказали:

  • Статические члены обычно предназначены для помощников, заводских методов или констант
  • API возвращает массив (или список)
  • Эта замена string-foo в лучшем случае просто отрывочна. Каждый раз, когда вы работаете со стандартом, таким как JSON или XML, используйте библиотеки для преобразования его в объект, а затем манипулируйте

Вот рабочий фрагмент:

 using System;
using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;

namespace HttpsApiTest
{
    class Program
    {

        public class ForQuery
        {
            public bool bid { get; set; }
            public List<int> types { get; set; }
            public List<object> regions { get; set; }
            public List<object> systems { get; set; }
            public int hours { get; set; }
            public int minq { get; set; }
        }

        public class Buy
        {
            public ForQuery forQuery { get; set; }
            public long volume { get; set; }
            public double wavg { get; set; }
            public double avg { get; set; }
            public double variance { get; set; }
            public double stdDev { get; set; }
            public double median { get; set; }
            public double fivePercent { get; set; }
            public double max { get; set; }
            public double min { get; set; }
            public bool highToLow { get; set; }
            public long generated { get; set; }
        }

        public class ForQuery2
        {
            public bool bid { get; set; }
            public List<int> types { get; set; }
            public List<object> regions { get; set; }
            public List<object> systems { get; set; }
            public int hours { get; set; }
            public int minq { get; set; }
        }

        public class Sell
        {
            public ForQuery2 forQuery { get; set; }
            public int volume { get; set; }
            public double wavg { get; set; }
            public double avg { get; set; }
            public double variance { get; set; }
            public double stdDev { get; set; }
            public double median { get; set; }
            public double fivePercent { get; set; }
            public double max { get; set; }
            public double min { get; set; }
            public bool highToLow { get; set; }
            public long generated { get; set; }
        }

        public class RootObject
        {
            public Buy buy { get; set; }
            public Sell sell { get; set; }
        }

        static void Main(string[] args)
        {
            string sURL = "https://api.evemarketer.com/ec/marketstat/json?typeid=1230amp;regionlimit=10000002";
            StreamReader objReader = new StreamReader(WebRequest.Create(sURL).GetResponse().GetResponseStream());
            string sLine = objReader.ReadLine();

            var obj = JToken.Parse(sLine).ToObject<List<RootObject>>();

            Console.WriteLine("Buy node:");

            Console.WriteLine(" Max: "   obj[0].buy.max);
            Console.WriteLine(" HighToLow: "   obj[0].buy.highToLow);

            Console.WriteLine("Sell node:");

            Console.WriteLine(" Max: "   obj[0].sell.max);
            Console.WriteLine(" HighToLow: "   obj[0].sell.highToLow);

            Console.ReadLine();
        }
    }
}
  

Ответ №2:

Замена строки приведет к удалению всех экземпляров квадратных скобок. Вам было бы лучше десериализовать ответ в виде списка RootObjects.

Ответ №3:

 class Data
    {
        public string DataPoint;
    }

    class CustomData
    {
        public Data Dp;
    }

    class Utility
    {
        public T JsonDeserialisation<T>(string jsonFile)
        {
            TextReader textReader = new StreamReader(jsonFile);
            JsonTextReader jsonReader = new JsonTextReader(textReader);
            return JsonSerializer.CreateDefault().Deserialize<T>(jsonReader);
        }
    }
  

Поскольку у вас заранее есть все классы, вы можете использовать следующий универсальный десериализатор json. Здесь ‘T’ — это класс CustomData