0

次の形式のjsonがあります。ここで、キーは属性タイプを表し、値はその属性の値を表します。

{ "attributes":
[
  {
    "key":"name",
    "value":"Archit"
  },
  { 
    "key":"website",
    "value":"stackoverflow"
  },
  { 
    "key":"languages",
    "value":[
              "python",
              "java",
              "c++"
            ]
  }
]
}

jackson を使用して、次の Java オブジェクトにマップしようとしています。

public class Attributes {
  List<Attribute> attributes;
}



public abstract class Attribute {
  String key;
}



public class SingleValuedAttribute extends Attribute{
  String value;
}


public class MultiValuedAttribute extends Attribute{
  List<String> value;
}


  ObjectMapper mapper = new ObjectMapper();
  Attributes attributes = mapper.readValue(new File(jsonFilePath), Attributes.class);

ポリモーフィックなデシリアライゼーションを試してみましたが、json オブジェクトに型情報が必要でしたが、これは私の json に存在しませんか?

これを行う方法に関するヒントはありますか?

PS: json 形式を変更できません。キーのリストは制限されていません。

4

1 に答える 1

2

SingleValuedAttributeMultiValuedAttributeクラスの違いがわかりません。SingleValuedAttributeclass は 1 つの要素配列を表します。POJO クラスの階層を削除することで簡素化できます。

以下の例を参照してください。

import java.io.File;
import java.util.Arrays;
import java.util.List;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

        File json = new File("/x/test.json");
        System.out.println(objectMapper.readValue(json, Attributes.class));
    }
}

class Attributes {

    private List<Attribute> attributes;

    //getters, setters
}

class Attribute {

    private String key;
    private List<String> value;

    //getters, setters
}

上記のプログラムは次のように出力します:

[Attribute [key=name, value=[Archit]], Attribute [key=website, value=[stackoverflow]], Attribute [key=languages, value=[python, java, c++]]]
于 2013-09-07T21:48:10.750 に答える