mxst

mxst

Hey everyone,
I was wondering if there is a chance to decode am map from json to a map of predefined structs. Important is that the keys are not predefined.

So in the end I would love to transform this

{
  "text": "A pet food distribution center where the animal can tap the screen and receive a treat or meal. Would allow for healthy regulation and training.",
  "annotation_candidates": {
    "tap": {
      "text": "tap",
      "resource_candidates": [
        {
          "label": "Tap water",
          "resource": "http://dbpedia.org/resource/Tap_water"
        },
        {
          "label": "Tap dance",
          "resource": "http://dbpedia.org/resource/Tap_dance"
        }
      ]
    },
    "receive": {
      "name": "receive",
      "offset": 71,
      "resource_candidates": [
        {
          "label": "Radio receiver",
          "resource": "http://dbpedia.org/resource/Radio_receiver"
        }
      ]
    }
  ]
}

into this

%AnnotationCandidates{
  text: "A pet food distribution center where the animal can tap the screen and receive a treat or meal. Would allow for healthy regulation and training.",
  annotation_candidates: %{
    "tap" => %AnnotationCandidate{
      text: "tap",
      offset: 52,
      resource_candidates: [
        %ResourceCandidate{
          label: "Tap Water"
          resource: "http://dbpedia.org/resource/Tap_water",
                confidence: 0.2600142258675502
        }, 
        %ResourceCandidate{ ... }
      ]
    },
    "receive" => %AnnotationCandidate{ ... }
  }
}

I don’t know if that is possible (or a dumb idea)

Thank you for your help.

Showing Posts 1 to 4

kokolegorille

kokolegorille

It looks it’s not really valid json because of extra commas… without, You might

iex(29)> json = ~s(
...(29)>   {
...(29)>     "text": "A pet food distribution center where the animal can tap the screen and receive a treat or meal. Would allow for healthy regulation and training.",
...(29)>     "annotation_candidates": {
...(29)>       "tap": {
...(29)>         "text": "tap",
...(29)>         "resource_candidates": [
...(29)>           {
...(29)>             "label": "Tap water",
...(29)>             "resource": "http://dbpedia.org/resource/Tap_water"
...(29)>           },
...(29)>           {
...(29)>             "label": "Tap dance",
...(29)>             "resource": "http://dbpedia.org/resource/Tap_dance"
...(29)>           }
...(29)>         ]
...(29)>       }
...(29)>     }
...(29)>   }
...(29)> )
"\n  {\n    \"text\": \"A pet food distribution center where the animal can tap the screen and receive a treat or meal. Would allow for healthy regulation and training.\",\n    \"annotation_candidates\": {\n      \"tap\": {\n        \"text\": \"tap\",\n        \"resource_candidates\": [\n          {\n            \"label\": \"Tap water\",\n            \"resource\": \"http://dbpedia.org/resource/Tap_water\"\n          },\n          {\n            \"label\": \"Tap dance\",\n            \"resource\": \"http://dbpedia.org/resource/Tap_dance\"\n          }\n        ]\n      }\n    }\n  }\n"
iex(30)> Jason.decode json
{:ok,
 %{
   "annotation_candidates" => %{
     "tap" => %{
       "resource_candidates" => [
         %{
           "label" => "Tap water",
           "resource" => "http://dbpedia.org/resource/Tap_water"
         },
         %{
           "label" => "Tap dance",
           "resource" => "http://dbpedia.org/resource/Tap_dance"
         }
       ],
       "text" => "tap"
     }
   },
   "text" => "A pet food distribution center where the animal can tap the screen and receive a treat or meal. Would allow for healthy regulation and training."
 }}

If it’s not json compliant, it returns an error. For example if You add commas at the end of resource lines.

You can see this document.

PS: I use Jason instead of Poison, but it might be the same problem.
Once You have struct, it’s easy to finish your transformation.

Fl4m3Ph03n1x

Fl4m3Ph03n1x

You can’t go from a JSON into a struct directly, but you can go from a JSON to a Map and then use the map to create a Struct.

I recommend you are a look at Jason. Once you have a map or a keyword list, have a look that struct(map, opts) and you will be ready to go.

mxst

mxst OP

I’m using Posion so far with @derive [Poison.Encoder] and it works really well if I know the keys of the map beforehand.

axelson

axelson

Scenic Core Team

Structs have fixed keys. So if you don’t know the keys ahead of time then you can’t use a structural and need to use a map instead.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
ryanwinchester
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted” Version...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews