2

JSON文字列があります:

{
    "fruit": {
        "weight":"29.01",
        "texture":null
    },
    "status":"ok"
}

...私はPOJOにマップしようとしています:

public class Widget {
    private double weight; // same as the weight item above
    private String texture; // same as the texture item above

    // Getters and setters for both properties
}

上記の文字列 (マップしようとしているもの) は、実際にはorg.json.JSONObject内に含まれており、そのオブジェクトのtoString()メソッドを呼び出すことで取得できます。

Jackson JSONオブジェクト/JSON マッピング フレームワークを使用してこのマッピングを行いたいと考えています。これまでのところ、これが私の最善の試みです。

try {
    // Contains the above string
    JSONObject jsonObj = getJSONObject();

    ObjectMapper mapper = new ObjectMapper();
    Widget w = mapper.readValue(jsonObj.toString(), Widget.class);

    System.out.println("w.weight = " + w.getWeight());
} catch(Throwable throwable) {
    System.out.println(throwable.getMessage());
}

readValue(...)残念ながら、Jacksonメソッドが実行されると、このコードは例外をスローします。

Unrecognized field "fruit" (class org.me.myapp.Widget), not marked as ignorable (2 known properties: , "weight", "texture"])
    at [Source: java.io.StringReader@26c623af; line: 1, column: 14] (through reference chain: org.me.myapp.Widget["fruit"])

次のマッパーが必要です。

  1. 外側の中括弧 (" {" と " }") を完全に無視する
  2. fruitを に変更Widget
  3. status丸ごと無視

これを行う唯一の方法がJSONObjecttoString()メソッドを呼び出すことである場合は、それでかまいません。しかし、Jackson には、Java JSON ライブラリで既に動作する「箱から出してすぐに使える」ものが付属しているのだろうか?

いずれにせよ、Jackson マッパーを作成することが私の主な問題です。誰かが私が間違っている場所を見つけることができますか? 前もって感謝します。

4

1 に答える 1

5

PojoClassと呼ばれる(has-a)Widgetインスタンスを含むクラスが必要ですfruit

マッパーでこれを試してください:

    String str = "{\"fruit\": {\"weight\":\"29.01\", \"texture\":null}, \"status\":\"ok\"}";
    JSONObject jsonObj = JSONObject.fromObject(str);
    try
    {
        // Contains the above string

        ObjectMapper mapper = new ObjectMapper();
        PojoClass p = mapper.readValue(jsonObj.toString(), new TypeReference<PojoClass>()
        {
        });

        System.out.println("w.weight = " + p.getFruit().getWeight());
    }
    catch (Throwable throwable)
    {
        System.out.println(throwable.getMessage());
    }

これはあなたのWidgetクラスです。

public class Widget
{    private double weight;
     private String texture;
    //getter and setters.
}

これはあなたのPojoClass

public class PojoClass
{
    private Widget fruit;
    private String status;
    //getter and setters.
}
于 2012-12-28T05:22:22.513 に答える