具有复合键的地图的JSON表示
我想将以下(java)数据结构序列化为JSON:
class Machine { String name; Map parts; } class PartDescriptor { String group; String id; hashCode() equals() } class Part { String group; String id; String description; String compat; ... ... }
什么是一Machine
JSON表示?
另外( 可选 ),指向JSON到Java序列化器/反序列化器,它将支持您的表示
我会做类似的事情:
{ "name": "machine name", "parts": [ { "group": "part group", "id": "part id", "description": "...", ... }, { "group": "part group", "id": "part id", "description": "...", ... }, // ... ] }
如果每个Part的“id”是唯一的,则“parts”属性可以是对象而不是数组,每个部分的“id”用作键。
{ "name": "machine name", "parts": { "1st part id": { "group": "part group", "description": "...", ... }, "2nd part id": { "group": "part group", "description": "...", ... }, // ... } }
您不需要注释或自定义序列化程序。 假设你已经拥有Part
和Machine
中所有字段的getter,那么真正缺少的就是PartDescriptor
上的toString()
。 如果由于某种原因,您没有getter函数,则需要使用@JsonProperty
注释感兴趣的字段,以便Jackson知道要包含在序列化输出中的字段。 但是,简单地创建getter更好(也更容易)。
PartDescriptor
上的toString()
应返回要在映射中使用的键。 正如另一个答案所示,您可能只是连接相关字段:
@Override public String toString() { return group + "|" + id; }
当你尝试用Jackson的ObjectMapper
序列化一Machine
时,你会神奇地得到这个表格:
{ "name" : "Toaster", "parts" : { "Electrical|Descriptor1" : { "group" : "Electrical", "id" : "Part1", "description" : "Heating Element", "compat" : "B293" }, "Exterior|Descriptor2" : { "group" : "Exterior", "id" : "Part2", "description" : "Lever", "compat" : "18A" } } }
我会这样做的。 顶级对象的parts
键是JSONObject
的JSONArray
,它具有key
和value
。 key
是一个对象是PartDescriptor
, value
将是你的Part
。
{ "name":"theName", "parts":[ { "key":{ "group":"theGroup", "id":"theId" }, "value":{ "group":"theGroup", "id":"theId", "description":"theDescription", "compat":"theCompat", ... } }, ... ] }
假设group + id给出一个唯一的组合,并且“:”是允许的分隔符:
{ "name": "machine name", "parts": { "somegroup:01465": { "group":"somegroup", "id": "01465", ... }, "othergroup:32409": { "group":"othergroup", "id": "32409", ... } } }
它可以呈现如下表:
由于缺少通过属性的元数据,标记会分解为以下JSON对象:
{ "HTMLTableElement": [ { "classname": "machine", "name": "" }, { "HTMLTableRowElement": [ { "HTMLTableCellElement": {"classname":"partdescriptor","colspan":2} }, { "HTMLTableCellElement": {"classname":"part","colspan":4} } ] }, { "HTMLTableRowElement": [ { "HTMLTableCellElement": {"classname":"partdescriptor group"} }, { "HTMLTableCellElement": {"classname":"partdescriptor","id":""} }, { "HTMLTableCellElement": {"classname":"part","id":""} }, { "HTMLTableCellElement": {"classname":"description"} }, { "HTMLTableCellElement": {"classname":"compat"} } ] } ] }
或者,Unicode可以简化映射:
{"name":"","[{\u0022group\u0022:\u0022\u0022},{\u0022id\u0022:\u0022\u0022}]": [ {"group":""}, {"id":""}, {"description":""}, {"compat":""} ] }
哪个可以字符串化:
JSON.stringify({"name":"","[{\u0022group\u0022:\u0022\u0022},{\u0022id\u0022:\u0022\u0022}":[{"group":""},{"id":""},{"description":""},{"compat":""}]})
生产:
"{\"name\":\"\",\"[{\\\"group\\\":\\\"\\\"},{\\\"id\\\":\\\"\\\"}]\":[{\"group\":\"\"},{\"id\":\"\"},{\"description\":\"\"},{\"compat\":\"\"}]}"
哪个可以解析:
JSON.parse("{\"name\":\"\",\"[{\\\"group\\\":\\\"\\\"},{\\\"id\\\":\\\"\\\"}]\":[{\"group\":\"\"},{\"id\":\"\"},{\"description\":\"\"},{\"compat\":\"\"}]}")
生成一个对象文字:
({name:"", '[{"group":""},{"id":""}]':[{group:""}, {id:""}, {description:""}, {compat:""}]})
参考
-
HTMLTableRowElement
-
HTMLTableCellElement