2016-08-02 18 views
0

Ich versuche JSX zu verwenden, um eine Liste von Tupeln in ein JSON-Objekt zu konvertieren.Wie konvertieren Mnesia Abfrage Ergebnisse in eine JSON'able Liste?

Die Listenelemente werden auf einer Rekord Definition zugrunde:

-record(player, {index, name, description}). 

und sieht wie folgt aus:

[ 
    {player,1,"John Doe","Hey there"}, 
    {player,2,"Max Payne","I am here"} 
] 

Die Abfrage-Funktion wie folgt aussieht:

select_all() -> 
    SelectAllFunction = 
     fun() -> 
      qlc:eval(qlc:q(
       [Player || 
        Player <- mnesia:table(player) 
       ] 
      )) 
     end, 
    mnesia:transaction(SelectAllFunction). 

Was die richtige ist Möglichkeit, es zu einem JSON konvertierbar zu machen, da ich weiß, dass ich ein Schema des verwendeten Datensatzes habe und die Struktur kenne Tupel?

Antwort

0

Sie müssen den Datensatz in einen Ausdruck konvertieren, der jsx korrekt in JSON codieren kann. Angenommen, Sie möchten ein Array von Objekten im JSON für die Liste der player Datensätze haben, müssen Sie entweder alle player in eine Map oder eine Liste von Tupeln konvertieren. Sie müssen die Zeichenfolgen auch in Binärdateien konvertieren, sonst wird jsx diese in eine Liste von Ganzzahlen codieren. Hier ist ein Beispielcode:

-record(player, {index, name, description}). 

player_to_json_encodable(#player{index = Index, name = Name, description = Description}) -> 
    [{index, Index}, {name, list_to_binary(Name)}, {description, list_to_binary(Description)}]. 

go() -> 
    Players = [ 
     {player, 1, "John Doe", "Hey there"}, 
     % the following is just some sugar for a tuple like above 
     #player{index = 2, name = "Max Payne", description = "I am here"} 
    ], 
    JSON = jsx:encode(lists:map(fun player_to_json_encodable/1, Players)), 
    io:format("~s~n", [JSON]). 

Test:

1> r:go(). 
[{"index":1,"name":"John Doe","description":"Hey there"},{"index":2,"name":"Max Payne","description":"I am here"}]