Je suis en train d'analyser le JSON de vide sanitaire avec aseon:Comment analyser JSON imbriqué, qui contient également des listes, dans Haskell?
JSON
{
"response": [
{
"id": 5555,
"brandId": 10,
"productTypeId": 1,
"identity": {
"sku": "ABCDEF",
"ean": "1111",
"barcode": "2222"
},
"productGroupId": 17,
"stock": {
"stockTracked": true,
"weight": {
"magnitude": 0
},
"dimensions": {
"length": 0,
"height": 0,
"width": 0,
"volume": 0
}
},
"financialDetails": {
"taxable": false,
"taxCode": {
"id": 7,
"code": "T1"
}
},
"variations": [
{
"optionId": 1,
"optionName": "option1",
"optionValueId": 5,
"optionValue": "5"
},
{
"optionId": 2,
"optionName": "option2",
"optionValueId": 14,
"optionValue": "OS"
}
]
},
{
"id": 9999,
"brandId": 10,
"productTypeId": 1,
"identity": {
"sku": "CDEFG",
"ean": "111221",
"barcode": "2443222"
},
"productGroupId": 17,
"stock": {
"stockTracked": true,
"weight": {
"magnitude": 0
},
"dimensions": {
"length": 0,
"height": 0,
"width": 0,
"volume": 0
}
},
"financialDetails": {
"taxable": false,
"taxCode": {
"id": 7,
"code": "T1"
}
},
"variations": [
{
"optionId": 1,
"optionName": "option1",
"optionValueId": 5,
"optionValue": "5"
},
{
"optionId": 2,
"optionName": "option2",
"optionValueId": 14,
"optionValue": "14"
}
]
}
]
}
J'ai essayé de mettre en place les structures de données et les instances: Voici ce que j'ai jusqu'à présent:
CODE
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Control.Applicative
import qualified Data.ByteString.Lazy.Char8 as BS
data Response = Response { response :: [Body]
} deriving (Show)
instance FromJSON Response where
parseJSON (Object v) = Response <$>
v .: "response"
data Body = Body { idd :: Int
, brandId :: Int
, productTypeId :: Int
, identity :: Identity
, productGroupId :: Int
, stock :: Stock
, financialDetails :: FinancialDetails
, variations :: [Variation]
} deriving (Show)
instance FromJSON Body where
parseJSON (Object v) = Body <$>
(e >>= (.: "id")) <*>
(e >>= (.: "brandId")) <*>
(e >>= (.: "productTypeId")) <*>
-- DON'T KNOW HOW TO SET UP IDENTITY
(e >>= (.: "productGroupId"))
-- DON'T KNOW HOW TO SET UP STOCK
-- DON'T KNOW HOW TO SET UP FINANCIAL DETAILS
-- DON'T KNOW HOW TO SET UP VARIATIONS
where e = (v .: "response")
data Identity = Identity { sku :: String
, ean :: String
, barcode :: String
} deriving (Show)
data Stock = Stock { stockTracked :: Bool
, weight :: Weight
, dimensions :: Dimensions
} deriving (Show)
data Weight = Weight { magnitude :: Double
} deriving (Show)
data Dimensions = Dimensions { length :: Double
, height :: Double
, width :: Double
, volume :: Double
} deriving (Show)
data FinancialDetails = FinancialDetails { taxable :: Bool
, taxCode :: TaxCode
} deriving (Show)
data TaxCode = TaxCode { id :: Int
, code :: String
} deriving (Show)
data Variation = Variation { optionId :: Int
, optionName :: String
, optionValueId :: Int
, optionValue :: String
} deriving (Show)
Mes problèmes sont que je ne sais pas comment lier les valeurs imbriquées et je ne peux comprendre comment gérer les parties de la liste des JS SUR. J'ai essayé de passer en revue la documentation et d'autres questions de stackoverflow; Cependant, je ne trouve rien pour aider à ce niveau de complexité.
Comment procéder pour obtenir des objets pour les valeurs imbriquées et pour les valeurs répertoriées.
Merci
je vous remercie pour votre réponse. J'ai essayé votre code avec le JSON modifié: 'decode json :: Maybe Body' = ** Nothing **. Qu'est-ce que je fais mal? – matthias
@matthias Essayez 'decode json :: Maybe Response', parce que votre document JSON contient une' Response' qui contient plusieurs 'Body's. – bheklilr
oui cela fonctionne. Est-ce que je ne peux pas accéder directement aux autres objets? – matthias