将JSON字符串转换为Java ME中的对象?


116

Java / J2ME中是否可以转换字符串,例如:

{name:"MyNode", width:200, height:100}

在一行代码中使用相同的内部对象表示形式?

由于当前方法过于繁琐:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

也许是JSON库?


6
您的字符串实际上并不是Json对象,请参阅Json标准...它更像是JavaScript表示法。
PhiLho

19
@杰里米·路德(Jeremy Rudd):应该是{"name":"MyNode", "width":200, "height":100}
EstebanKüber09年

1
@voyager:我知道,但是JavaScript本身支持不带引号的属性名称。
TheFlash

1
@PhiLho:我知道,但是为了清楚起见,我以这种方式保留了它。SO语法荧光笔会搞砸它。名称和值以红色显示。
TheFlash

有没有办法使用Java的核心API进行转换?也许在Java 8中?Java 9?
AlikElzin-kilaka '16

Answers:


108

我用了其中一些,而我最喜欢的是

http://code.google.com/p/json-simple/

该库非常小,因此非常适合J2ME。

您可以像这样将JSON解析为Java对象,

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
我可以在applet中使用此库吗?如果它使用反射,那么我将面临反射权限错误。能行吗?
Mridang Agarwalla

jsonSimple仍然具有JSONParser类吗?我不能上课。
phuwin '16

现在不推荐使用JSONParser。
VardaElentári17年

79

最简单的选择是Jackson

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

还有其他类似的易于使用的库(已经提到了Gson)。但是有些选择比较麻烦,例如原始的org.json库,即使您不需要这些,它也需要您创建中间的“ JSONObject”。


杰克逊不支持J2ME
skue,2012年

的确如此,如果j2me仍大致处于JDK 1.4级别(杰克逊需要1.5)
StaxMan 2012年

1
您只有2个主题,但值得更多。杰克逊真的很容易插入我们的应用程序。感谢您的推荐。
Dan Doyon

1
杰克逊还可以反序列化为一个普通的对象。例如。Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye 2014年


61

GSON是将Java对象转换为json对象,反之亦然的好选择。
它是Google提供的工具。

用于将json转换为java对象使用:fromJson(jsonObject,javaclassname.class)
用于将java对象转换为json对象使用:toJson(javaObject)
其余将自动完成

有关更多信息和下载


1
+1我正在寻找类似的东西,这完全符合要求!
罗伊·唐

23

您可以使用Google GSON轻松完成此操作。

假设您有一个名为User的类,其字段为user,width和height,并且要将以下json字符串转换为User对象。

{"name":"MyNode", "width":200, "height":100}

您可以轻松地做到这一点,而不必使用以下代码进行强制转换(牢记nimcap的注释;)):

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

其中jsonString是上述JSON字符串。

有关更多信息,请查看https://code.google.com/p/google-gson/


3
是的,我知道这个问题是4年前提出的,但是我的回答是针对目前需要这样做的有关方面的:)希望它能对某人有所帮助!
sufinawaz

22

您有许多用于Java的JSON解析器

  • JSONObject.java
    JSONObject是名称/值对的无序集合。它的外部形式是用大括号括起来的字符串,在名称和值之间使用冒号,在值和名称之间使用逗号。内部形式是一个对象,它具有用于按名称访问值的get()和opt()方法,以及用于按名称添加或替换值的put()方法。值可以是以下任何一种:Boolean,JSONArray,JSONObject,Number和String或JSONObject.NULL对象。

  • JSONArray.java
    JSONArray是值的有序序列。它的外部形式是用方括号括起来的字符串,值之间用逗号分隔。内部形式是一个对象,该对象具有用于通过索引访问值的get()和opt()方法,以及用于添加或替换值的put()方法。值可以是以下任何一种:Boolean,JSONArray,JSONObject,Number和String或JSONObject.NULL对象。

  • JSONStringer.java
    JSONStringer是用于快速生成JSON文本的工具。

  • JSONWriter.java
    JSONWriter是用于快速将JSON文本写入流的工具。

  • JSONTokener.java
    JSONTokener接收源字符串,并从中提取字符和令牌。JSONObject和JSONArray构造函数使用它来解析JSON源字符串。

  • JSONException.java
    当检测到语法或程序错误时,将引发JSONException。

  • JSONString.java
    JSONString是一个允许类实现其JSON序列化的接口。


1
如果J2ME具有java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;,则可以使用第一个,因为它们是简单的java类。
EstebanKüber09年

2
我认为MIDP 2.0中没有java.lang.reflect包。将使制作通用解析器变得困难...
PhiLho

2
聪明的人,旅行者,您刚刚复制了标准Java JSON类的文档。
TheFlash

@杰里米·路德(Jeremy Rudd):当然,我做到了,你怎么认为我做得这么快?这并不是试图欺骗您,而是链接和复制的标准做法。不好意思,我很抱歉。
EstebanKüber09年

10
我对此表示反对,因为它无法回答问题。它给出了相关类的列表,但是它们都没有真正实现请求者想要的。
杰夫·马丁

7

JSON官方网站是您应查看的地方。它提供了可以与Java一起使用的各种库,我个人使用了这个,即JSON-lib,它是站点中工作的一种实现,因此它具有完全相同的类-本页面中的方法等。

如果您单击html链接,则可以找到所需的任何内容。

简而言之:

创建一个json对象和一个json数组,代码是:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1,o2可以是原始类型(long,int,boolean),字符串或数组。

反向过程非常简单,我的意思是将字符串转换为json对象/数组。

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

为了正确解析,您只需要知道您是解析数组还是对象即可。



5

就像已经说过的,使用JSON.simple做到这一点的一种非常简单的方法如下

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

然后使用jsonObj处理JSON对象。例如jsonObj.get(“ name”);

按照下面的链接,JSON.simple对小型和大型JSON文件都显示出恒定的效率

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/


您写了很多已经说过的建议。您的回答的实质是什么?
dakab,2015年

1
@dakab感谢您的评论。这个问题的实质是给出一行代码来达到目的。而且由于有许多可用的api来执行此操作,所以我也想提供一些有关api效率比较的其他信息。因此,我要回答的本质是提供代码+一些信息,以比较该线程中其他同事提到的不同api的效率。
Kripz




2

我已经编写了一个使用json.org解析JSON的库,但实际上它将为您创建接口的代理。代码/ JAR在code.google.com上。

http://fixjures.googlecode.com/

我不知道它是否可以在J2ME上运行。由于它使用Java Reflection创建代理,因此我认为它不起作用。此外,它目前对我要删除的Google收藏夹有很强的依赖性,并且它可能过于繁重,无法满足您的需求,但是它允许您以所需的方式与JSON数据进行交互:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

太神奇了,尽管我不想要Foo,而只是原生对象。
TheFlash

2

只需使用以下Json字符串在Java中创建一个Json对象。

{name:"MyNode", width:200, height:100}

如果以上是您的Json字符串,只需使用它创建一个Json对象。

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

Jackson用于大文件,GSON用于小文件,而JSON.simple用于处理这两种文件。


1
证据支持@thanga的评论,来自这里blog.takipi.com/…– Gob00st
2013年

我以前也看过,但也认为小文件无论如何都可以快速解析。我只考虑JSON.simple,如果您有大量小文件要解析,那么与Jackson的30%左右的差异将累加到一起。另请参阅此处的热门评论,该基准可能不太可靠。确实,如果速度对您来说很重要,则可能应该进行设计,以便可以注入解析器来轻松更改实现,并进行自己的基准测试。
用户
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.