2009-09-08 72 views
112

有没有用Java/J2ME的方式将字符串转换,如:将JSON字符串转换为Java ME中的对象?

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

到相同的内部对象表示,在一行代码?

因为目前的方法太繁琐:

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

也许JSON库?

+5

你的字符串不是一个真正的Json对象,请参阅Json标准... 它更像是JavaScript表示法。 – PhiLho 2009-09-08 20:21:50

+17

@Jeremy Rudd:应该是'{“name”:“MyNode”,“width”:200,“height”:100}' – voyager 2009-09-08 20:55:06

+1

@voyager:我知道,但JavaScript原生支持不带引号的属性名称。 – 2009-09-08 21:09:48

回答

107

我用他们几个和我最喜欢的是,

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

我可以在一个小程序中使用这个库。如果它使用Reflection,那么我将面临反射许可错误。它会起作用吗? – 2010-05-08 16:01:46

+0

jsonSimple还有JSONParser类吗?我不能打电话给班级。 – 2016-07-05 14:35:39

+0

JSONParser现已弃用。 – 2017-06-21 15:34:30

22

你有很多JSON parsers for Java

  • 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序列化。

+0

这些在J2ME上有哪些工作? – 2009-09-08 18:39:54

+1

如果J2ME有java.io.IOException; java.io.Writer中; java.lang.reflect.Field中; java.lang.reflectModifier中; java.lang.reflect.Method中; java.util.Collection中;的java.util.HashMap; java.util.Iterator的; java.util.Map; java.util.TreeSet ;,那么你可以使用第一个,因为它们是简单的'java'类。 – voyager 2009-09-08 18:45:24

+2

我认为MIDP 2.0中没有java.lang.reflect包。 将难以制作一个通用的解析器... – PhiLho 2009-09-08 20:30:53

2

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

http://fixjures.googlecode.com/

我不知道这是否适用于J2ME。由于它使用Java反射来创建代理,所以我认为它不起作用。此外,它目前有上谷歌集合hard依赖,我想删除,它可能是太重量级您的需求,但它可以让你在路上你的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"); 
+0

令人惊讶的是,虽然我不想美孚,只是本地对象。 – 2009-09-08 21:11:21

59

GSON是将java对象转换为json对象的好选择,反之亦然。
这是一个由谷歌提供的工具。

转换JSON到Java对象使用:fromJson(jsonObject,javaclassname.class)
为Java对象转换成JSON对象使用:toJson(javaObject)
和其余部分将被自动

做更多information and for download

+1

+1我正在寻找类似的东西,这完全符合法案! – 2010-06-25 11:41:30

7

JSON official site是你应该看看在。它提供了可以与Java一起使用的各种库,我个人使用过这个,它是网站中工作的实现,所以它在这个page中具有完全相同的类方法等。

如果你点击html链接,你可以找到任何你想要的。

简而言之:

创建JSON对象和JSON数组,代码:

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

O1,O2,可以是原语类型(长,整型,布尔值),字符串或阵列。

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

String myString; 

JSONObject obj = new JSONObject(myString); 

JSONArray array = new JSONArray(myString); 

为了正确解析,你只需要知道,如果你正在分析一个数组或对象。

78

最简单的方法是Jackson

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

还有其他类似的简单易用库(GSON已经提到);但有些选择更加费力,像原始组织一样。json库,它需要你创建中间的“JSONObject”,即使你不需要这些。

+0

杰克逊不支持J2ME – skue 2012-08-19 21:48:17

+0

没错,如果j2me仍然大致处于JDK 1.4级别(杰克逊需要1.5) – StaxMan 2012-08-20 20:35:37

+1

您只有2个upticks,但值得更多。杰克逊非常容易插入我们的应用程序。感谢您的推荐。 – 2013-01-15 17:31:01

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 2013-10-07 22:04:51

3

JSON IO是迄今为止最简单的方法,以JSON字符串或JSON输入流转换为Java对象

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

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

0

只是做一个JSON对象在Java中与用下列JSON String.In你的情况

{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")); 
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/

+0

你写过很多已经说过你发布的建议。你的答案的本质是什么? – dakab 2015-11-02 05:52:13

+1

@dakab感谢您的意见。这个问题的实质是给出一行代码来达到目的。由于有很多apis可以做到这一点,我只是想给出一些关于apis效率比较的其他信息。所以这个答案的本质就是给代码+一些关于本主题中其他人提到的不同apis效率比较的信息。 – Kripz 2015-11-02 22:23:32

2

杰克逊对于大文件,GSON对于小文件,和JSON 。简单的为处理两者。

+1

有证据可以从这里备份@ thanga的评论http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ – Gob00st 2016-03-11 18:14:13

+0

我已经看到在此之前,还要考虑小文件快速解析。我只会考虑JSON.simple,如果你有一个TON的小文件来解析杰克逊30%左右的差距将加起来的地方。另请参阅顶部的评论,基准可能不太可靠。真的,如果速度对你来说很重要,你应该设计一个让你可以注入一个解析器来轻松地改变实现,并且做你自己的基准测试。 – User 2016-08-27 23:25:33

相关问题