【问题标题】:JSON to Java Object without creating class (PHP way)JSON 到 Java 对象而不创建类(PHP 方式)
【发布时间】:2012-01-16 00:56:30
【问题描述】:

我正在处理从 twitter API 获取的 json 数据

在 PHP 上,我通常会执行以下操作:

$data = json_decode($response);$data 将是 STD 类对象

我想在 Java 中做同样的事情。

我查看了 Gson,但我需要第二个参数,似乎我需要为获取的数据创建一个特定的类。

基本问题是如何将 JSON 转换为标准 Java 对象,如 PHP(STD 类对象)

谢谢

【问题讨论】:

    标签: java php json object


    【解决方案1】:

    Java 中没有标准的类对象,因此您需要一个类。您可以在运行时动态创建和编译该类,但我怀疑这是否值得。

    【讨论】:

      【解决方案2】:

      如果您的 JSON 数据不遵循特定结构,请不要使用 GSON,而是使用常规 JSON 库(例如来自 json.org 的那个),它会为您提供像 JSONObject 这样的类的实例,从中你可以访问像jsonObject.getString("key")这样的数据。

      【讨论】:

      • +1 json.org - 在大多数情况下简单而足够(在您的回答中添加了指向 json.org 的链接 - 希望您不介意)
      • 这样可以解决问题,但是如何访问对象内部的嵌套对象呢?
      • @bn - 通过调用jsonObject.getObject("key")。阅读 javadocs。
      • 不想上课,要如何获取对象?也许我不明白你最初的问题
      • 例如我想在 PHP $data->resultset->result->username 中访问这样的嵌套对象。我如何在 Java 中做到这一点?
      【解决方案3】:

      当 PHP 服务器上不存在 json_encode 时,我使用这个:

      <?php
      if (!function_exists('json_encode'))
      {
        function json_encode($a=false)
        {
          if (is_null($a)) return 'null';
          if ($a === false) return 'false';
          if ($a === true) return 'true';
          if (is_scalar($a))
          {
            if (is_float($a))
            {
              // Always use "." for floats.
              return floatval(str_replace(",", ".", strval($a)));
            }
      
            if (is_string($a))
            {
              static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
              return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
            }
            else
              return $a;
          }
          $isList = true;
          for ($i = 0, reset($a); $i < count($a); $i++, next($a))
          {
            if (key($a) !== $i)
            {
              $isList = false;
              break;
            }
          }
          $result = array();
          if ($isList)
          {
            foreach ($a as $v) $result[] = json_encode($v);
            return '[' . join(',', $result) . ']';
          }
          else
          {
            foreach ($a as $k => $v) $result[] = json_encode($k).':'.json_encode($v);
            return '{' . join(',', $result) . '}';
          }
        }
      }
      ?>
      

      如果你可以用 Java 重写它,那么它应该对你有用。

      参考:(死链接)http://snippets.dzone.com/posts/show/7487

      【讨论】:

        【解决方案4】:

        使用 Jackson 将其读入地图,然后您可以访问所需的任何数据。例如,如果你的 json 看起来像这样

        { "name":"blah",
          "address": {
            "line1": "1234 my street",
            "city": "my city",
            "state": "my state"
          }
        }
        

        那么你可以:

        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> mystuff = mapper.readValue( jsonString, Map.class );
        String name = (String)mystuff.get("name");
        String city = ((Map<String, Object>)mystuff.get( "address" )).get( "city" );
        

        【讨论】:

        • 这看起来很简单。我会试试这个
        • 我在几个单元测试中使用它,我正在测试生成 JSON 的代码并且它运行良好。这很简单,Jackson 速度很快。
        • String city = ((Map)mystuff.get("address")).get("city");给我一个问题,它是一个对象,而不是一个字符串。添加 .toString() 来修复它
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 2020-07-05
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 2015-07-22
        • 1970-01-01
        相关资源
        最近更新 更多