具有复合键的地图的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": "...", ... }, // ... } } 

您不需要注释或自定义序列化程序。 假设你已经拥有PartMachine中所有字段的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键是JSONObjectJSONArray ,它具有keyvaluekey是一个对象是PartDescriptorvalue将是你的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