3

我有一个结构,它是顶层的对象,主要包含字符串作为值和一个嵌套对象。它应该看起来像:

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

我猜是因为 JSObject 拥有一个键/值对列表,所以无法在同一级别上混合不同的值类型。这似乎是一个巨大的限制,所以我希望我错了!

4

2 回答 2

7

Text.JSON 允许您嵌套对象,正如您从类型定义中看到的那样:

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

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

类型是递归的 - JSValues 可能是 JSObjects,而 JSObjects 又可能是 JSValues 的字典。

于 2013-06-04T15:40:27.413 回答
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 ......

于 2013-06-05T10:16:03.113 回答