在 Java ME 中将 JSON 字符串转换为对象?
Posted
技术标签:
【中文标题】在 Java ME 中将 JSON 字符串转换为对象?【英文标题】:Convert a JSON string to object in Java ME? 【发布时间】:2010-11-26 14:28:38 【问题描述】: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 库?
【问题讨论】:
您的字符串并不是真正的 Json 对象,请参阅 Json 标准...它更像是 javascript 表示法。 @Jeremy Rudd:应该是"name":"MyNode", "width":200, "height":100
@voyager:我知道,但 JavaScript 本身支持不带引号的属性名称。
@PhiLho:我知道,但为了清楚起见,我保持这种方式。 SO 语法荧光笔会把它搞砸。名称和值以红色显示。
有没有办法使用 Java 的核心 API 进行转换?也许在 Java 8 中? Java 9?
【参考方案1】:
我用过其中一些,我最喜欢的是,
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"));
【讨论】:
我可以在小程序中使用这个库吗?如果它使用反射,那么我将面临反射权限错误。行得通吗? jsonSimple 是否还有 JSONParser 类?我不能给班级打电话。 JSONParser 现已弃用。 这对我帮助很大,谢谢。【参考方案2】:最简单的选择是Jackson:
MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);
还有其他类似的简单易用的库(Gson 已经提到过);但是有些选择比较费力,比如原始的 org.json 库,它需要你创建中间的“JSONObject”,即使你不需要这些。
【讨论】:
杰克逊不支持 J2ME 是的,如果 j2me 仍然大致处于 JDK 1.4 级别(Jackson 需要 1.5) 您只有 2 次上调,但值得更多。 Jackson 很容易插入到我们的应用程序中。谢谢推荐。 Jackson 也可以反序列化为普通对象。例如。Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
更多使用 Jackson 的代码示例:mkyong.com/java/how-to-convert-java-object-to-from-json-jackson【参考方案3】:
GSON 是将 java 对象转换为 json 对象的好选择,反之亦然。 是google提供的工具。
用于将 json 转换为 java 对象使用:fromJson(jsonObject,javaclassname.class)
用于将 java 对象转换为 json 对象使用:toJson(javaObject)
休息会自动完成
了解更多information and for download
【讨论】:
+1 我正在寻找类似的东西,这完全符合要求!【参考方案4】:您可以使用 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/
【讨论】:
是的,我知道这个问题是 4 年前提出的,但我的答案是针对目前需要这样做的相关方 :) 希望它对某人有所帮助!【参考方案5】:你有很多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 序列化的接口。
【讨论】:
如果J2ME有java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.方法; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet;,那么你可以使用第一个,因为它们是简单的java
类。
我认为 MIDP 2.0 中没有 java.lang.reflect 包。将难以制作通用解析器...
聪明人,航海者,你刚刚复制了标准 Java JSON 类的文档。
@Jeremy Rudd:当然我做到了,你怎么觉得我做得这么快?这不是试图欺骗你,它的标准做法是链接和复制。如果结果是这样,我很抱歉。
我对此投了反对票,因为它没有回答问题。它给出了相关类的列表,但它们都没有真正完成提问者想要的。【参考方案6】:
JSON official site 是您应该查看的位置。它提供了各种可以与 Java 一起使用的库,我个人使用过这个,JSON-lib,它是站点中工作的一个实现,所以它在这个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 可以是原始类型(long、int、boolean)、字符串或数组。
反向过程相当简单,我的意思是将字符串转换为 json 对象/数组。
String myString;
JSONObject obj = new JSONObject(myString);
JSONArray array = new JSONArray(myString);
为了正确解析,您只需要知道您是在解析数组还是对象。
【讨论】:
【参考方案7】:为此使用 google GSON 库
public static <T> T getObject(final String jsonString, final Class<T> objectClass)
Gson gson = new Gson();
return gson.fromJson(jsonString, objectClass);
http://iandjava.blogspot.in/2014/01/java-object-to-json-and-json-to-java.html
【讨论】:
【参考方案8】:就像许多人已经说过的那样,使用 JSON.simple 的一种非常简单的方法如下
import org.json.JSONObject;
String someJsonString = "name:"MyNode", width:200, height:100";
JSONObject jsonObj = new JSONObject(someJsonString);
然后使用jsonObj来处理JSON Object。例如 jsonObj.get("name");
根据以下链接,JSON.simple 对小型和大型 JSON 文件都显示出恒定的效率
http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/
【讨论】:
你写了很多人已经说明了你发布的建议。你回答的本质是什么? @dakab 感谢您的 cmets。这个问题的本质是给出一行代码来达到这个目的。由于有很多 API 可以做到这一点,我只是想提供一些关于 API 效率比较的额外信息。所以我的意思是这个答案的本质是提供代码+一些关于这个线程中其他研究员提到的不同api的效率比较的信息。【参考方案9】:JSON IO 是将 JSON 字符串或 JSON 输入流转换为 Java 对象的最简单方法
字符串到 Java 对象Object obj = JsonReader.jsonToJava("[\"Hello, World\"]");
https://code.google.com/p/json-io/
【讨论】:
【参考方案10】:这是一个老问题,当时 json-simple (https://code.google.com/p/json-simple/) 可能是一个很好的解决方案,但请考虑该项目似乎暂时不活跃!
我建议 Gson 现在托管在:https://github.com/google/gson
如果性能是您的问题,您可以查看一些比较基准http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/。
【讨论】:
【参考方案11】:除了www.json.org,您还可以使用 javacc 实现自己的解析器并匹配您的个人语法/模式。 请在我的博客上查看此注释:http://plindenbaum.blogspot.com/2008/07/parsing-json-with-javacc-my-notebook.html
【讨论】:
哇。我敢打赌,这既简单又有趣。 很遗憾,我们没有“有趣”和“有见地”的徽章可以给予 :)【参考方案12】:我编写了一个使用 json.org 解析 JSON 的库,但它实际上会为您创建一个接口代理。代码/JAR 位于 code.google.com。
http://fixjures.googlecode.com/
我不知道它是否适用于 J2ME。由于它使用 Java 反射来创建代理,我认为它不起作用。此外,它目前对我想要删除的 Google Collections 有很强的依赖关系,它可能对您的需求来说太重了,但它允许您以您正在寻找的方式与您的 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,只想要原生 Object。【参考方案13】:只需使用以下 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"));
【讨论】:
【参考方案14】:Jackson 处理大文件,GSON 处理小文件,JSON.simple 处理两者。
【讨论】:
从这里支持@thanga 评论的证据blog.takipi.com/… 我以前也看到过,但也考虑到小文件无论如何都可以快速解析。我只会考虑 JSON.simple 如果你有大量的小文件来解析与杰克逊 30% 左右的差异将加起来的地方。另请参阅那里的*** cmets,该基准可能不太可靠。确实,如果速度对您来说很重要,您可能应该进行设计,以便可以注入解析器来轻松更改实现,并进行自己的基准测试。以上是关于在 Java ME 中将 JSON 字符串转换为对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java ME 中将 StringBuffer 转换为 InputStream?
在 JAVA 中将 Json dateTime 转换为字符串