7

CXF 内で Jackson を使用してデータをシリアライズ/デシリアライズしています。残念ながら、JSON 配列をデシリアライズするように CXF/Jackson を構成するのに苦労しています。問題の解決にご協力いただければ幸いです。

この時点まで、ほとんどの json データはオブジェクト形式でした。

{ "objectCollection": [ {...}, {...}, {...}... ] }

ただし、問題の json データは次の形式です。

[ {...}, {...}, {...} ]

Web サービス エンドポイントは、単一のプロパティ (JSON 配列を介して送信されるグループのコレクション) を持つ "GroupsDto" オブジェクト (以下を参照) を想定しています。

@PATH(...)
public Response createGroups(GroupsDto groups) {
...
}

GroupsDto コレクション プロパティに @JsonDeserialize を次のように追加しましたが、機能しません。「START_ARRAYトークンからGroupsDtoのインスタンスを逆シリアル化できません」というメッセージが引き続き表示されます

public class GroupsDto {

       private Collection<GroupDto> groups;

       /**
        * @return the groups
        */
       @XmlElement(name="group")
       @JsonDeserialize(contentAs=GroupDto.class)
       public Collection<GroupDto> getGroups() {
               return groups;
       }
...
}
4

2 に答える 2

1

setter@JsonDeserialize(contentAs=GroupDto.class)でを指定するだけです。Serialization is always on get desserialization is always on set、または必要に応じてフィールドで両方を指定できます。

シリアライズシリアライズのドキュメント

コードサンプル:

import java.io.IOException;
import java.util.List;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonDeserialize;

public class JacksonDeserialize {

    public static class ModelClass {

        private String name;

        public ModelClass() {
        }

        public String getName() {
            return name;
        }

        public void setName(final String name) {
            this.name = name;
        }

        public ModelClass(final String name) {
            super();
            this.name = name;
        }

        @Override
        public String toString() {
            return "ModelClass [name=" + name + "]";
        }

    }

    public static class ListModelClass {

        private List<ModelClass> list;

        @JsonDeserialize(contentAs = ModelClass.class)
        public void setList(final List<ModelClass> list) {
            this.list = list;
        }

        @Override
        public String toString() {
            return "ListModelClass [list=" + list + "]";
        }

    }

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println(objectMapper.readValue("{\"list\":[{\"name\":\"name1\"},{\"name\":\"name2\"}]}",
                ListModelClass.class));
    }

}
于 2012-06-19T18:23:14.737 に答える