2017-02-07 6 views
3

Я пытаюсь потреблять API, который возвращает JSON построен как:Играя с Type Поставщиком и JSON API

Team.player1/Player2/player3 ... (игроки построены в качестве свойств, а не в виде массива)

Я думал использовать рефлексию, чтобы сделать это, но с трудом получить игрока.

type Simple = JsonProvider<"sample.json"> 

let wbReq = "API-FOR-TEAM"  

let docAsync = Simple.Load(wbReq) 

let allValues = FSharpType.GetRecordFields (docAsync.Team.Players.GetType()) 
let test = allValues 
      |> Seq.map (fun p -> (p.GetValue(docAsync.Team.Players) as ?).Name) // HOW TO GET THE TYPED PLAYER HERE ? 
      |> fun p -> printfn p 

EDIT: Я пытался использовать GetType и System.Convert.ChangeType

edit2: Вот упрощенная версия JSON:

{ 
    "Team": { 
     "id": "8", 
     "players": { 
      "17878": { 
       "info": { 
        "idteam": 8, 
        "idplayer": 17878, 
        "note": 6 
       } 
      }, 
      "18507": { 
       "info": { 
        "idteam": 8, 
        "idplayer": 18507, 
        "note": 5 
       } 
      } 
     } 
    } 
} 

Edit 3:

I нашел удобное решение на C# (благодаря JSON.net и динамическому), но для целей обучения я хотел бы сделать то же самое в F #, если кто-то захочет помочь:

 private static List<Player> Parse(string jsonString) 
     { 
      dynamic jsonObject = JsonConvert.DeserializeObject(jsonString); 

      var players = ParseItems(jsonObject.Home.players); 

      return players; 
     } 

     private static List<Player> ParseItems(dynamic items) 
     { 
      List<Player> itemList = new List<Player>(); 
      foreach (var item in items) 
      { 
       itemList.Add(new Player() 
       { 
        idplayer = item.Value.info.idplayer, 
        lastName = item.Value.info.lastname, 
        note = item.Value.info.note 
       }); 
      } 
      return itemList; 
     } 
+0

Не уверен, что я понимаю, что вы хотите получить –

+1

Возможно, вы можете показать пример json? –

+0

уверенный @FoggyFinder дайте мне знать, если сейчас лучше, thx – rad

ответ

2

Вы можете смешивать JsonTypeProvider и разбор Json. Например:

[<Literal>] 
let sample = """{ 
    "Team": { 
     "id": "8", 
     "players": { 
      "17878": { 
       "info": { 
        "idteam": 8, 
        "idplayer": 17878, 
        "note": 6 
       } 
      }, 
      "18507": { 
       "info": { 
        "idteam": 8, 
        "idplayer": 18507, 
        "note": 5 
       } 
      } 
     } 
    } 
}""" 

type Player = {IdTeam:int; IdPlayer:int; Note:int} 

type Simple = JsonProvider<sample> 
let docAsync = Simple.GetSample() 

let json = docAsync.Team.Players.JsonValue 

let parseInfo (json:JsonValue) = 

    let id_team = (json.GetProperty "idteam").AsInteger() 
    let id_player = (json.GetProperty "idplayer").AsInteger() 
    let note = (json.GetProperty "note").AsInteger() 

    {IdTeam = id_team; IdPlayer = id_player; Note = note} 

let players = 
    json.Properties() 
    |> Array.map(fun (_,x) -> x.GetProperty "info") 
    |> Array.map (parseInfo) 

players 
|> Array.iter (printfn "%A") 

 Смежные вопросы

  • Нет связанных вопросов^_^