web-dev-qa-db-ja.com

JavaモデルのJSONフィールドマッピング

送信されるJSON:

_{
  "Banner": "ABC"
}
_

Javaモデル:

_...
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class BannerData implements Java.io.Serializable {

    private static final long serialVersionUID = 5664846645733319592L;

    @JsonProperty(value = "Banner")
    private String banner;

    public String getBanner() {
        return banner;
    }

    public void setBanner(String banner) {
        this.banner = banner;
    }
}
_

コントローラ:

_@RequestMapping(value = {"/GetBanner"}, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> enrollCustomer(@RequestBody BannerData body, HttpServletRequest request) throws Exception {
...
}
_

_/GetBanner_へのリクエストは次を返します:
クライアントから送信されたリクエストは構文的に正しくありませんでした。

Works OK jsonが(小文字の名前のままJavaフィールド名)に変更されたとき:

_{
  "banner": "ABC"
}
_

ただし、大文字フィールド名が必要です[〜#〜] json [〜#〜]
@JsonProperty(value = "Banner")のように見えません。

正しいマッピングですか?

19
sergionni

多分あなたはちょうどしようとします:

@JsonProperty("Banner")

「値=」なし。私は自分のプロジェクトでそれを使用しましたが、実際には期待どおりに機能しました。

[〜#〜]更新[〜#〜]

問題の動作をテストするために、いくつかのテストクラスを作成しました。私がやった事:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;


@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class BannerData implements Java.io.Serializable {

 private static final long serialVersionUID = 5664846645733319592L;

 @JsonProperty("Banner")
 private String banner;

 public String getBanner() {
     return banner;
 }

 public void setBanner(String banner) {
     this.banner = banner;
 }
}

Jsonを読み取る別のクラス:

import org.codehaus.jackson.map.ObjectMapper;
import Java.io.File;
import Java.io.IOException;

public class BannerReader {
 private static final String JSON_PATH = "pathToYourJson";

 public BannerData readBanner() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(new File(JSON_PATH), BannerData.class);
 }
}

そして最後に、エントリポイントクラス:

import Java.io.IOException;

public class BannerTest {

 public static void main(String[] args) throws IOException {
     BannerReader reader = new BannerReader();
     BannerData bannerData = reader.readBanner();
     System.out.println(bannerData.getBanner());
 }
}

プリント:

ABC

使用される依存関係:

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.13</version>
</dependency>

jsonファイル:

{
  "Banner": "ABC"
}

更新2

上記のコードは機能しませんが、追加してみてください

@JsonProperty("Banner")

プライベート変数だけでなく、次のようなゲッター/セッターのペアにも対応します。

@JsonProperty("Banner")
private String banner;

@JsonProperty("Banner")
public String getBanner() {
  return banner;
}

@JsonProperty("Banner")
public void setBanner(String banner) {
  this.banner = banner;
}
13
Arthur Eirich

以下をお勧めします。 (ObjectMapperを使用している場合)

objectMapperを取得したら、PascalCaseでPropertyNamingStrategyを設定できます。 これはドキュメントへのリンクです

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
    PropertyNamingStrategy.PascalCaseStrategy);

ObjectMapper-を使用していない場合は、BannerDataクラスに@JsonNamingを次のように注釈します-

@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) 
public class BannerData implements Java.io.Serializable {

私は@JsonNamingを発見しました ここgithubにあります

6
Ashish Patil

ゲッターでお試しください

_@JsonProperty(value = "Banner")
public String getBanner() {
_

編集:

Spring設定ファイルを見せてください。あなたは本当にジャクソンを使っていますか? http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program を参照してください

_ <!-- Configure to plugin JSON as request and response in method handler -->
 <beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
     <beans:property name="messageConverters">
         <beans:list>
             <beans:ref bean="jsonMessageConverter"/>
         </beans:list>
     </beans:property>
 </beans:bean>

 <!-- Configure bean to convert JSON to POJO and vice versa -->
 <beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
 </beans:bean> 
_

編集2

ジャクソンを使用している場合と使用していない場合があるため、他の注釈を試してください@XmlElement(name="Banner")

おそらくGSONから@SerializedName("Banner")

3
Shaun

ジャクソンを1.9.13から2.5.4に更新しようとしましたか(別のアーティファクトグループID-com.fasterxml.jacksonがあります)

このコードはあなたにとって正しく機能していますか?

ObjectMapper mapper = new ObjectMapper();
BannerData bannerData = mapper.readValue("{ \"Banner\": \"ABC\"}", BannerData.class);

私とうまく動作します(「バナー」を「バナー」に置き換えた場合-「バナー」フィールドがnullの間違ったオブジェクトが取得されます。)

また、このコードは役に立ちます:

System.out.println(mapper.getDeserializationConfig().getPropertyNamingStrategy());

プロパティの名前付け戦略に問題がある可能性があります-カスタムのものを使用する場合。

3
pkozlov