Skip to content

json.Marshal — doesn't work #12

Open

Description

@RubaXa

Hi,

I try convert OrderedMap to json, but receive empty object :/

package main

import (
	"fmt"
	"encoding/json"
	"github.com/elliotchance/orderedmap"
)

func main() {
	m := orderedmap.NewOrderedMap()

	m.Set("foo", "bar")
	m.Set("qux", 1.23)
	m.Set(123, true)

	b, err := json.Marshal(m)
	if err != nil {
		fmt.Println("error:", err)
	}
	
	fmt.Println("result:", string(b)) // "result: {}" ⚠️
}

https://play.golang.org/p/UFER3tR6uPA

Activity

  1. elliotchance commented on Apr 1, 2020

    @elliotchance
    Owner

    This is because marshalling has not been implemented for orderedmap.

    I'm not sure what this would actually look like because it must be reasonable that the order would also be retained in the data structure. So simply using a JSON object would not be sufficient.

    Since there are multiple ways marshalling and unmarshalling could work so it's best to leave it up to the implementation. Here is one example that might suit your needs:

    https://play.golang.org/p/LjOrp4k6lqf

  2. abusizhishen commented on Jul 9, 2020

    @abusizhishen

    This is because marshalling has not been implemented for orderedmap.

    I'm not sure what this would actually look like because it must be reasonable that the order would also be retained in the data structure. So simply using a JSON object would not be sufficient.

    Since there are multiple ways marshalling and unmarshalling could work so it's best to leave it up to the implementation. Here is one example that might suit your needs:

    https://play.golang.org/p/LjOrp4k6lqf

    marshaling and unmarshaling may cause unexpected issue, like int type will be marshal into int64 type in your example
    https://play.golang.org/p/IjP7E3lRMhT

  3. elliotchance commented on Jul 9, 2020

    @elliotchance
    Owner

    If the order and specific data types must be retained in the serialized value then you will need a more complex marshaller to suit your specific needs.

  4. 89trillion-feiyang commented on Jun 30, 2021

    @89trillion-feiyang

    This is because marshalling has not been implemented for orderedmap.

    I'm not sure what this would actually look like because it must be reasonable that the order would also be retained in the data structure. So simply using a JSON object would not be sufficient.

    Since there are multiple ways marshalling and unmarshalling could work so it's best to leave it up to the implementation. Here is one example that might suit your needs:

    https://play.golang.org/p/LjOrp4k6lqf

    The structure after serialization is not what I want.

    According to your code result is

    [
       [
         "2",
        {
          "a": "2",
          "b": "7"
        }
      ],
      [
        "3",
        {
          "a": "3",
          "b": "1"
        }
      ]
    ]

    Expect:

    {
      "2": {
            "a": 3,
            "b": 4
        }
    }
  5. elliotchance commented on Jul 1, 2021

    @elliotchance
    Owner

    @89trillion-feiyang - you can serialize it in any format you want. Here's some sample code to produce that: https://play.golang.org/p/tKGpbGCpFbC

    Keep in mind some caveats with that:

    1. The order will be lost when serializing (and unserializing). There's no way around that because Go sorts maps for JSON output.
    2. All of your keys must be strings.
  6. 89trillion-feiyang commented on Jul 2, 2021

    @89trillion-feiyang

    @89trillion-feiyang - you can serialize it in any format you want. Here's some sample code to produce that: https://play.golang.org/p/tKGpbGCpFbC

    Keep in mind some caveats with that:

    1. The order will be lost when serializing (and unserializing). There's no way around that because Go sorts maps for JSON output.
    2. All of your keys must be strings.

    OK. Thanks! I solved it.

  7. GitRowin commented on Dec 9, 2024

    @GitRowin

    Consider using my library, built on top of this library: https://github.com/GitRowin/orderedmapjson

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions