Json Api значения 0 или ложь - PullRequest
0 голосов
/ 07 марта 2019

Я использую веб-интерфейс JSON для предоставления некоторых значений из игрового рынка в объекты 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=1230&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();
        }
    }
}

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

[
  {
    "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); показывает как ложь вместо истины.Что я делаю неправильно?Последние несколько часов я искал решения этой проблемы, но безрезультатно.Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 07 марта 2019
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);
        }
    }

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

0 голосов
/ 07 марта 2019

То, что они сказали:

  • Статические члены обычно предназначены для помощников, фабричных методов или констант
  • API возвращает массив (или список)
  • Та замена строки-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=1230&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();
        }
    }
}
0 голосов
/ 07 марта 2019

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

...