具有复合键的地图的JSON表示

Op *_*kel 13 javascript java serialization json

我想将以下(java)数据结构序列化为JSON:

class Machine {
  String name;
  Map<PartDescriptor, Part> parts;
}

class PartDescriptor {
  String group;
  String id;

  hashCode()
  equals()
}

class Part {
  String group;
  String id;
  String description;
  String compat;
  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

什么是JSON代表一个Machine

另外(可选),指向JSON到Java序列化器/反序列化器,它将支持您的表示

Poi*_*nty 9

我会这样做:

{
  "name": "machine name",
  "parts": [
     { "group": "part group", "id": "part id", "description": "...", ... },
     { "group": "part group", "id": "part id", "description": "...", ... },
     // ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果每个Part的"id"是唯一的,则"parts"属性可以是对象而不是数组,每个部分的"id"用作键.

{
  "name": "machine name",
  "parts": {
     "1st part id": { "group": "part group", "description": "...", ... },
     "2nd part id": { "group": "part group", "description": "...", ... },
     // ...
  }
}
Run Code Online (Sandbox Code Playgroud)


qui*_*int 8

您不需要注释或自定义序列化程序.假设你已经有干将在所有领域PartMachine所有真正缺少的IS一个toString()PartDescriptor.如果由于某种原因,您没有getter函数,则需要注释感兴趣的字段,@JsonProperty以便Jackson知道哪些字段包含在序列化输出中.但是,简单地创建getter更好(也更容易).

toString()PartDescriptor应返回要在测绘使用的关键.正如另一个答案所示,您可能只是连接相关字段:

@Override
public String toString() {
    return group + "|" + id;
}
Run Code Online (Sandbox Code Playgroud)

当你试图Machine用Jackson的序列化时,你会神奇地得到这个表格ObjectMapper:

{
  "name" : "Toaster",
  "parts" : {
    "Electrical|Descriptor1" : {
      "group" : "Electrical",
      "id" : "Part1",
      "description" : "Heating Element",
      "compat" : "B293"
    },
    "Exterior|Descriptor2" : {
      "group" : "Exterior",
      "id" : "Part2",
      "description" : "Lever",
      "compat" : "18A"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案无法反序列化为原始类型.在这种特定情况下,它可能通过在json反序列化后进行一些后处理来反序列化.但我建议不要走这条路,除非json严格用于人类消费,并且不需要反序列化. (2认同)

nic*_*ild 5

我会这样做。parts顶级对象的键是具有' s 和'sJSONArray的a。The将是一个属于您的对象,而 the将是您的。JSONObjectkeyvaluekeyPartDescriptorvaluePart

{
    "name":"theName",
    "parts":[
        {
            "key":{
                       "group":"theGroup",
                       "id":"theId"
                  },
            "value":{
                       "group":"theGroup",
                       "id":"theId",
                       "description":"theDescription",
                       "compat":"theCompat",
                       ...
                    }
        },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)