如何使用Java在JSON中输入和输出int?

如何使用Java在JSON中输入和输出int?,java,json,http,Java,Json,Http,我正在创建一个API,它将接受HTTP请求并返回JSON报告。我一直在Java(使用HTTPUrlConnection)和Python(使用请求)中测试请求。API是用XML编写的。我正在用Python进行一些测试,因为请求更容易处理。我使用的Python代码是为了深入了解我正在尝试做什么,因为这是可行的 我请求的一些参数作为JSON对象的字符串表示形式传递。我发现,当一个JSON对象字符串被传递到我的API并被解析时,该对象会根据其来源而得到不同的处理,特别是当所讨论的数据是int时 在Pyt

我正在创建一个API,它将接受HTTP请求并返回JSON报告。我一直在Java(使用HTTPUrlConnection)和Python(使用请求)中测试请求。API是用XML编写的。我正在用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异常:
java.lang.String在设置clientID int时无法转换为java.lang.long
。这很容易修复。因此,这条线现在变成:

int clientId = (int)(long) Long.parseLong((String) report.get("client_id"));
这不仅是丑陋的,而且造成了相反的问题。现在我有了“java.lang.Long不能转换为java.lang.String!”

我在Java中创建对象时是否有问题?还是我处理的请求不正确

编辑: 我正在使用

字符串输出: 爪哇

蟒蛇

{'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");
返回基于键的long。然后从long到int转换


或者,您可以将Java中clientId的声明改为long而不是int。这样就不需要强制转换了。

report.get(“客户端id”);
将为您提供一个
字符串
对象,该对象不能被强制转换为
long
int
。使用
report.getLong
report.getInt

您在服务器端使用哪个JSON库?不同的JSON实现将有不同的API来获取对象的值(包括数字),但通常它们会返回双精度。客户机生成的json字符串是什么样子的,它们是如何比较的?此外,您真正的问题似乎是“如何使用Java在json中输入和输出整数?”?",不是Python和Java之间的比较。我添加了这些信息,并更改了问题标题,感谢您的建议。请同时粘贴异常堆栈跟踪,并在发生异常的代码中标记行号。我还建议您使用jackson json api。它将使用single fun将原始响应转换为json或从json转换为jsonAction call.可能重复的
int clientId = (int) report.getLong("client_id");