在 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 转换为字符串

如何在 Java 中将 YAML 转换为 JSON?

在C#中将对象转换为JSON字符串[重复]

无法在 Android 中将 java 字符串转换为 JSON 数组

在 PHP 中将对象转换为 JSON 并将 JSON 转换为对象,(像 Gson for Java 之类的库)