【问题标题】:Convert a JSON string to object in Java ME?在 Java ME 中将 JSON 字符串转换为对象?
【发布时间】: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?

标签: java json java-me serialization


【解决方案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=" + json.get("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);
【解决方案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=" + yourJsonObject.getString("width"));
          

          【讨论】:

            【解决方案14】:

            Jackson 处理大文件,GSON 处理小文件,JSON.simple 处理两者。

            【讨论】:

            • 从这里支持@thanga 评论的证据blog.takipi.com/…
            • 我以前也看到过,但也考虑到小文件无论如何都可以快速解析。我只会考虑 JSON.simple 如果你有大量的小文件来解析与杰克逊 30% 左右的差异将加起来的地方。另请参阅那里的顶级 cmets,该基准可能不太可靠。确实,如果速度对您来说很重要,您可能应该进行设计,以便可以注入解析器来轻松更改实现,并进行自己的基准测试。
            猜你喜欢
            • 2011-06-19
            • 1970-01-01
            • 2011-08-30
            • 1970-01-01
            • 2021-09-18
            • 1970-01-01
            • 2021-01-16
            • 1970-01-01
            相关资源
            最近更新 更多