Как провайдеры типа F # используются в изменяющейся конечной точке Rest / JSON? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь использовать поставщиков типа F # для включения данных о погоде в мое приложение.Я использую OpenWeatherMap.org для получения текущих данных о погоде.https://openweathermap.org/current

Иногда в ответе OpenWeatherMap не отображается JSON для дождя (например, в течение 1 часа дождя нет).

Так что, если я сделаю что-то вроде этого:

type WeatherForecast= JsonProvider<"http://api.openweathermap.org/data/2.5/weather?lat=39.64&lon=-74.28&appid=MyKeyICantSharePublicly">
...
let mydata = WeatherForecast.Load("http://api.openweathermap.org/data/2.5/weather/?lat=12&lon=12&appid=MyKeyICantSharePublicly)

printf "%s" (string mydata.Rain.``1h``)

Оператор printf не будет выполнен, потому что он не всегда знает, что такое mydata.Rain, потому что поставщик типов больше не предоставляет информацию о Rain.

В зависимости от того, когда я пытаюсь скомпилировать мойприложения, сборка завершится неудачно из-за провайдера типов.

Как использовать провайдеров типов с такой конечной точкой Rest / Json, как этот?

Пример данных.

{
  "coord": {
    "lon": -74.28,
    "lat": 39.64
  },
  "weather": [
    {
      "id": 701,
      "main": "Mist",
      "description": "mist",
      "icon": "50d"
    },
    {
      "id": 721,
      "main": "Haze",
      "description": "haze",
      "icon": "50d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 7.71,
    "pressure": 1012,
    "humidity": 93,
    "temp_min": 7,
    "temp_max": 9.4
  },
  "visibility": 4023,
  "wind": {
    "speed": 5.7,
    "deg": 2...

1 Ответ

0 голосов
/ 20 ноября 2018

Вместо URL вы должны предоставить несколько образцов с дождем и без него:

type People = JsonProvider<""" 
  [ { "name":"John", "age":94 }, 
    { "name":"Tomas" } ] """, SampleIsList=true>

for item in People.GetSamples() do 
  printf "%s " item.Name 
  item.Age |> Option.iter (printf "(%d)")
  printfn ""

В приведенных выше примерах есть две записи, одна из которых включает age, а другая - нет.Это делает поле age int option.

Из документации: http://fsharp.github.io/FSharp.Data/library/JsonProvider.html

...