3

私は、主に文字列を値として含み、ネストされたオブジェクトを1つ含む、最上位のオブジェクトである構造を持っています。次のようになります。

{
  "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 である場合があり、これは 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 に答える