19

次の(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;
  ...
  ...
}

1つのJSON表現は何Machineですか?

また(オプション)、あなたの表現をサポートするJSONからJavaへのシリアライザー/デシリアライザーを教えてください

4

6 に答える 6

14

私は次のようなことをします:

{
  "name": "machine name",
  "parts": [
     { "group": "part group", "id": "part id", "description": "...", ... },
     { "group": "part group", "id": "part id", "description": "...", ... },
     // ...
  ]
}

各パーツの「id」が一意である場合、「parts」プロパティは、各パーツの「id」をキーとして、配列ではなくオブジェクトにすることができます。

{
  "name": "machine name",
  "parts": {
     "1st part id": { "group": "part group", "description": "...", ... },
     "2nd part id": { "group": "part group", "description": "...", ... },
     // ...
  }
}
于 2012-06-06T12:21:49.537 に答える
10

注釈やカスタム シリアライザーは必要ありません。Partandのすべてのフィールドのゲッターが既にあると仮定するとMachine、実際に欠けているのはtoString()onだけPartDescriptorです。何らかの理由でゲッター関数がない場合は、関心のあるフィールドに注釈を付けて、@JsonPropertyJackson がシリアル化された出力に含めるフィールドを認識できるようにする必要があります。ただし、単純に getter を作成する方が望ましい (そして簡単です)。

toString()onは、PartDescriptorマッピングで使用するキーを返す必要があります。別の回答が示唆するように、関連するフィールドを単純に連結できます。

@Override
public String toString() {
    return group + "|" + id;
}

Machine次に、Jackson の でa をシリアライズしようとすると、魔法のようにこのフォームが得られます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"
    }
  }
}
于 2013-08-17T03:22:19.577 に答える
4

私はこれをします。parts最上位オブジェクトのキーは、とJSONArrayJSONObject持つkeyのになりvalueます。はkeyあなたのオブジェクトでありPartDescriptor、はvalueあなたのPartです。

{
    "name":"theName",
    "parts":[
        {
            "key":{
                       "group":"theGroup",
                       "id":"theId"
                  },
            "value":{
                       "group":"theGroup",
                       "id":"theId",
                       "description":"theDescription",
                       "compat":"theCompat",
                       ...
                    }
        },
        ...
    ]
}
于 2012-06-06T12:22:16.603 に答える
1

group+id が一意の組み合わせを提供し、「:」が許容される区切り文字であると仮定します。

{  
   "name": "machine name",
   "parts": { 
               "somegroup:01465": {
                                    "group":"somegroup",
                                    "id": "01465",
                                    ...
                                  },
               "othergroup:32409": {
                                     "group":"othergroup",
                                     "id": "32409",
                                     ...
                                   }

            }
}
于 2012-06-06T12:42:08.700 に答える