2013-06-04 79 views
3

我有一個結構,它是頂層的一個對象,主要包含字符串作爲值和一個嵌套對象。它應該是這個樣子:是否有可能使用Text.JSON在haskell中創建嵌套的JSON對象?

{ 
    "name" : "expand", 
    "type" : "2", 
    "code" : "...", 
    "options" : { 
    "atb" : { 
     "description" : "..", 
     "value" : true 
    } 
} 

我猜測,因爲JSObject保存鍵/值對的列表,也沒有在同一水平上混合不同類型的值的方式。這似乎是一個巨大的限制,所以我希望我錯了!

+0

每個鍵 - 值對的值可以是數組還是對象? –

+0

我無法想象它不可能。我的懷疑是你只需要添加一個以'atb'作爲鍵和另一個JSObject作爲值的kv對。 – evanmcdonnal

回答

7

Text.JSON允許你嵌套對象,因爲你可以看到the type definition

data JSValue 
    = JSNull 
    | JSBool  !Bool 
    | JSRational !Rational 
    | JSString JSString 
    | JSArray [JSValue] 
    | JSObject (JSObject JSValue) 

newtype JSObject e = JSONObject { fromJSObject :: [(String, e)] } 

的類型是遞歸 - JSValues可能JSObjects這反過來可能JSValues的字典。

1

如果你不已經與通用這樣做,這裏是用TEXT.JSON

的實例的方式
import Text.JSON 

data SO = SO { 
      name :: String, 
      mytype :: Int, 
      code :: String, 
      options :: [Option] 
     } deriving (Show) 

data Option =Option { 
       atb :: KV 
      } 


data KV = KV { 
       desc :: String, 
       v:: Bool 
       } 

instance JSON SO where 
    showJSON ge = makeObj 
      [ ("name", showJSON $ name ge), 
      ("type", showJSON $ mytype ge), 
      ("options", showJSON $ options ge) 
      ]       
    readJSON = error "readJSON not implemented for SO" 


instance JSON Option where 
    showJSON ge = makeObj 
      [ ("atb", showJSON $ atb ge) 
      ]       
    readJSON = error "readJSON not implemented for Option" 

instance JSON KV where 
    showJSON ge = makeObj 
      [ ("description", showJSON $ desc ge), 
      [ ("value", showJSON $ v ge) 
      ]       
    readJSON = error "readJSON not implemented for kv" 

--encode $ SO .........

相關問題