我想将以下(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;
...
...
}
一个Machine
的JSON表示是什么?
另外(可选),指向JSON到Java序列化器/反序列化器,它将支持您的表示
答案 0 :(得分:9)
我会做类似的事情:
{
"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": "...", ... },
// ...
}
}
答案 1 :(得分:8)
您不需要注释或自定义序列化程序。假设您已经拥有Part
和Machine
中所有字段的getter,那么真正缺少的就是toString()
上的PartDescriptor
。如果由于某种原因,您没有getter函数,则需要使用@JsonProperty
注释感兴趣的字段,以便Jackson知道要包含在序列化输出中的字段。但是,简单地创建getter更好(也更容易)。
toString()
上的PartDescriptor
应返回您要在映射中使用的密钥。正如另一个答案所示,您可能只是连接相关字段:
@Override
public String toString() {
return group + "|" + id;
}
当您尝试使用杰克逊Machine
序列化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"
}
}
}
答案 2 :(得分:2)
我会这样做。顶级对象的parts
键是JSONArray
JSONObject
个key
和value
。 key
将是您PartDescriptor
的对象,而value
将是您的Part
。
{
"name":"theName",
"parts":[
{
"key":{
"group":"theGroup",
"id":"theId"
},
"value":{
"group":"theGroup",
"id":"theId",
"description":"theDescription",
"compat":"theCompat",
...
}
},
...
]
}
答案 3 :(得分:1)
假设group + id给出一个唯一的组合,并且“:”是允许的分隔符:
{
"name": "machine name",
"parts": {
"somegroup:01465": {
"group":"somegroup",
"id": "01465",
...
},
"othergroup:32409": {
"group":"othergroup",
"id": "32409",
...
}
}
}
答案 4 :(得分:0)
JSON要求密钥必须是字符串,因此,如果您确实需要将数据表示为密钥(例如,您不想像Pointy的回答那样使用数组,因为您想保证它< em>合同中(没有重复的条目使用相同的密钥),那么您需要自行决定将复杂密钥序列化为字符串的方式。
如果要使用使用分隔符进行连接的方法(例如group1|part1
),要注意两点:
鉴于:
(可选),为我指向支持您的表示形式的JSON到Java序列化器/反序列化器
一个著名的例子可能是Gson-Google的Java JSON序列化程序库-使用以下表示形式:
{
"(group1,part1)": { description: ... },
"(group1,part2)": { description: ... },
"(group2,part1)": { description: ... },
...
"(groupX,partX)": {description: ... },
}
注意:需要通过设置enableComplexMapKeySerialization
(默认为for backwards compatibility禁用)来启用该功能
答案 5 :(得分:-4)
它可以呈现如下表:
<table class="machine" name="">
<tr>
<th class="partdescriptor" colspan="2">
<th class="part" colspan="4">
</tr>
<tr>
<td class="partdescriptor group"></td>
<td class="partdescriptor" id=""></td>
<td class="part group"></td>
<td class="part" id=""></td>
<td class="description"></td>
<td class="compat"></td>
</tr>
</table>
由于缺少通过属性的元数据,标记会分解为以下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:""}]})
<强>参考强>