簡體   English   中英

如何使用Java獲取和輸出JSON?

[英]How do I get an int in and out of JSON with Java?

我正在創建一個API,它將接受HTTP請求並返回JSON報告。 我已經在Java(使用HTTPUrlConnection)和Python(使用請求)中測試了請求。 該API用Java Spark編寫。 我正在用Python做一些測試,因為處理請求要容易一些。 自從我使用了Python代碼以來,它就可以洞悉我要做什么。

我的請求中的某些參數作為JSON對象的字符串表示形式傳遞。 我發現的是,當將JSON對象字符串傳遞到我的API並進行解析時,將根據對象的來源(特別是當相關數據為int時)對對象進行不同的處理。

在Python中:

report_dict = {
        "client_name": "Wayne_Enterprises",
        "client_id": 123,
        "report_type": "test_report",
        "timestamp_generated": "2015-08-11T11:00:00Z",
        "report_data": {"revenue": 40000}
    }
response = requests.post(myurl, data=json.dumps(report_dict))

在Java中:

JSONObject testData = new JSONObject();
JSONObject content = new JSONObject();
content.put("revenue", 40000);
testData.put("client_name","Wayne_Enterprises");
testData.put("client_id",123);
testData.put("report_type","test_report");
testData.put("timestamp_generated","2015-08-11T11:00:00Z");
testData.put("report_data",content.toString());

URL url = new URL("http","127.0.0.1",8080,"/reports/");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setDoOutput(true);
System.out.println(testData.toString());
DataOutputStream wr = new DataOutputStream (connection.getOutputStream());
wr.writeBytes(testData.toString());
wr.close();

JSON字符串在API中的處理方式如下:

120> JSONParser parser = new JSONParser();
121> JSONObject report = (JSONObject) parser.parse(request.body());
122> String reportType = (String) report.get("report_type");
123> String clientName = (String) report.get("client_name");
124> int clientId = (int)(long) report.get("client_id");
125> JSONObject data = (JSONObject)parser.parse((String)report.get("report_data"));
126> String dateStr = (String) report.get("timestamp_generated");

當我在Python中運行測試時,數據已成功發布。 但是,當我運行Java測試時,出現ClassCast異常:當我設置clientID int時java.lang.String cannot be cast to java.lang.long 好吧,這很容易修復。 現在,該行變為:

int clientId = (int)(long) Long.parseLong((String) report.get("client_id"));

這不僅丑陋,而且會帶來相反的問題。 現在我有'java.lang.Long無法轉換為java.lang.String!

我在Java中創建對象時做錯了什么? 還是我處理請求不正確?

編輯:我正在使用org.json.simple

字符串輸出:Java

{"report_data":"{\"revenue\":123}","timestamp_generated":"2000-01-01T12:00:00Z","report_type":"api_testing","client_name":"Wayne_Enterprises","client_id":123}

蟒蛇

{'client_name': 'test_client', 'report_data': '{"revenue": 4000}', 'report_type': 'transparency', 'client_id': 123, 'timestamp_generated': '2015-07-29T11:00:00Z'}

堆棧跟蹤:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
        at com.simplerelevance.Main.lambda$init$1(Main.java:124)
        at com.simplerelevance.Main$$Lambda$2/449105069.handle(Unknown Source)
        at spark.SparkBase$1.handle(SparkBase.java:311)
        at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:159)
        at spark.servlet.SparkFilter.doFilter(SparkFilter.java:131)
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet
Handler.java:1652)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:585)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:143)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.jav
a:577)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandl
er.java:223)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:1127)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
515)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandle
r.java:185)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:1061)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:141)
        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(Cont
extHandlerCollection.java:215)
        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerColl
ection.java:110)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:97)
        at org.eclipse.jetty.server.Server.handle(Server.java:497)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.jav
a:257)
        at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java
:540)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPoo
l.java:635)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:555)
        at java.lang.Thread.run(Thread.java:745)

為什么不使用:

int clientId = (int) report.getLong("client_id");

getLong根據密鑰返回一個long。 然后,您從long轉換為int。

或者,您可以將Java中的clientId聲明更改為long類型,而不是int類型。 然后,無需鑄造。

report.get("client_id”);將為您提供一個String對象,不能將其report.getLonglongint而是使用report.getLongreport.getInt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM