在Java ME中如何将JSON字符串转换为对象?

118

在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
20
@Jeremy Rudd:应该是{"name":"MyNode", "width":200, "height":100} - Esteban Küber
1
@voyager:我知道,但JavaScript本地支持不带引号的属性名称。 - Robin Rodricks
1
@PhiLho:我知道,但是出于清晰起见,我保持了这种方式。SO语法高亮会把它搞砸。名称和值为红色。 - Robin Rodricks
有没有使用Java的核心API进行转换的方法?也许在Java 8中?Java 9? - AlikElzin-kilaka
14个回答

112

我使用了几个库,我最喜欢的是:

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
我能在小程序中使用这个库吗?如果它使用了反射,那么我可能会遇到反射权限错误。它会起作用吗? - Mridang Agarwalla
jsonSimple还有JSONParser类吗?我无法调用该类。 - phuwin
JSONParser现已弃用。 - Varda Elentári
这对我帮助很大,谢谢。 - HellishHeat

81

最简单的选择是Jackson

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

还有其他同样易于使用的库(如Gson);但有些选择更费力,比如原始的org.json库,即使您不需要中间的“JSONObject”,也需要创建它。


Jackson不支持J2ME。 - skue
如果j2me仍大致处于JDK 1.4水平(Jackson要求1.5),则返回True。 - StaxMan
1
你只有两个赞,但应该得到更多。杰克逊很容易插入我们的应用程序中。感谢您的推荐。 - Dan Doyon
1
Jackson也可以反序列化为普通对象。例如:Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class); - neoneye
更多使用Jackson的代码示例:https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/ - cellepo

61

GSON是一个将Java对象转换为JSON对象以及相反转换的良好工具选项。
这是由Google提供的工具。

要将JSON转换为Java对象,请使用:fromJson(jsonObject,javaclassname.class)
要将Java对象转换为JSON对象,请使用:toJson(javaObject)
剩下的内容将自动完成

欲知更多信息并下载


1
+1 我在寻找类似的东西,这个完美符合要求! - Roy Tang

23

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

假设您有一个名为User的类,具有用户、宽度和高度字段,并且您想要将以下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”类。 - Esteban Küber
2
我认为在MIDP 2.0中没有java.lang.reflect包,这将使得编写通用解析器变得困难。 - PhiLho
2
聪明的人,旅行者,你刚刚复制了标准Java JSON类的文档。 - Robin Rodricks
@Jeremy Rudd:当然了,你怎么想我能这么快完成呢?这不是恶意挑衅,同时链接和复制是标准做法。如果让你误解了,我很抱歉。 - Esteban Küber
10
我将这个帖子点踩是因为它没有回答问题。它提供了一系列相关的类,但是没有一个可以实现提问者想要的。 - Jeff Martin

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);

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


7

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
1
@dakab 感谢您的评论。这个问题的本质是要给出一行代码来实现目的。由于有许多可用的API来完成此操作,我只想提供一些关于比较不同API效率的额外信息。因此,我想表达的答案的本质是给出代码+其他人在此线程中提到的不同API效率比较的一些信息。 - Kripz

3

3

JSON IO是将JSON字符串或JSON输入流转换为Java对象的最简单方法。

将字符串转换为Java对象
Object obj = JsonReader.jsonToJava("[\"Hello, World\"]");

https://code.google.com/p/json-io/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接