2017-12-06 7 views
1

私は、このJSONオブジェクトJersey/TomcatでこのHashMapが正しくフォーマットされていないのはなぜですか?

{ 
    "Flight1" : 757, 
    "Flight2" : 107, 
    "Flight3" : 637, 
} 

を生成モックエンドポイントをマックしたかったので、私は書かれて、このリソース書いた、ジャージーをテストしています:

@GET 
@Path("myjson") 
@Produces(MediaType.APPLICATION_JSON) 
public String getMyJson(@QueryParam ("test1") String lat, @QueryParam("test2") String lng) { 
    HashMap<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("Flight 1", 765); 
    map.put("Flight 2", 657); 
    map.put("Flight 3", 908); 
    return map.toString(); 
} 

をしかし、その後、私はときに、この応答を取得私は

{ Flight 1=765, Flight 2=657, Flight 3=908 }

/myjsonを呼び出します

Jerseyは、どの要素がStringであり、どの要素がIntegerであるかを既に知っていますが、すべてが数字であるかのようにフォーマットされます。 また、Jsonは、 "pretty"フォーマッタではフォーマットできません。これは、httpクライアントが解析するのが難しいと考えています。

は、だから私の質問は以下のとおりです。

  1. ですが、なぜでしょうか?

  2. それを避けるため、正しく

答えて

1

あなたはシリアライズとせずに直接応答オブジェクトをデシリアライズするためにJAXB注釈を追加することができます変換する。このためにはジャージーのjaxbライブラリーを追加して、ジャージー環境がブートされるときに自動変換機能を使用可能にする必要があります。

例:

@Path("jaxbResource") 
@Produces("application/xml") 
@Consumes("application/xml") 
public class UserResource { 
    @GET 
    public User[] getUserArray() { 
    List<User> userList = new ArrayList<User>(); 
    userList.add(new User(1, "John")); 
    ……… 
    return userList.toArray(new User[userList.size()]); 
    } 
} 

@XmlRootElement 
public class User { 
    private int id; 
    private String name; 

    public User() {} 

    public User(int id,String name) { 
     this.id = id; 
     this.name = name; 
    } 
    ……… 
} 

・ホープ、このことができます!

+1

ありがとうございました!もしあなたがこの質問に助けを求めて来たのであれば、間違いなくSunilの本https://www.amazon.com/Developing-RESTful-Web-Services-Jersey/dp/1783288299をチェックしてください。 – Tlink

1

ですが、なぜでしょうがフォーマットされ、テストのための簡単なモックJSONオブジェクトを作成する方法?

あなたはHashMapのtoStringを作成しているだけなので、 Ex。

HashMap<String,String> stringStringHashMap = new HashMap<String, String>(); 
    stringStringHashMap.put("a","b"); 
    stringStringHashMap.put("b","b"); 
    stringStringHashMap.put("c","b"); 

印刷します{b=b, c=b, a=b}

それを避けるために、( 正しく

あなたはライブラリの多くを使用することによってこれを行うことができますフォーマットされたテストのための簡単なモックJSONオブジェクトを書き込む方法Gson、Jackson、JsonSimpleなど)が含まれます。 これは既にあなたがしたいと答えた通りですHashMap to Json

+0

これは意味があります。 – Tlink

1

これはJersey/Tomcatとは関係ありません。コアとなるJavaプログラミングの場合、最も良い方法はtoString()メソッドがmapからStringを処理できる方法です。

そうするためには、

String jon = JSONObject.valueToString(map); 

    System.out.println(jon); 

を使用したり、使用してJSONObjectに変換することができますgson

よう
Gson gson = new Gson(); 
    String json = gson.toJson(map); 
    System.out.println(json); 
+0

これは意味があります。したがって、私はプロジェクトにJSONObjectをインポートしましたが、アプリケーションがクラッシュし、I: 'java.lang.ClassNotFoundException:org.json.JSONObject'は' /Users/USERNAME/.m2/repository/org/json/json/20160212/json-20160212.jar' jarはジャージーがそれを見つけるための特定の場所になければなりませんか? – Tlink

+0

私はGSONを使ったばかりですが、今は大丈夫です。再度、感謝します。 – Tlink

関連する問題