【问题标题】:JSCONObject.getString( "list" ) now returning org.json.JSONException: JSONObject["list"] not a stringJSCONObject.getString("list") 现在返回 org.json.JSONException: JSONObject["list"] not a string
【发布时间】:2019-01-10 16:53:54
【问题描述】:

如果以下代码多年来都能完美运行。突然,当它运行时,我在帖子标题中收到错误消息。

responseContactList 从 api 调用返回。生成的 tempStr 包含以下 JSON: { “列表”: { "access_level": "只读", "地址": "9997-dlsrir-b8aky4@mg.lmsnet.com", "created_at": "2019 年 1 月 10 日星期四 15:20:35 -0000", “描述”: ””, "members_count": 1, "name": "123 N. MICHIGAN AVENUE CONDOMINIUM ASSOCIATION" } }

我验证了 JSON 是好的。当我单步调试调试器并观察 getString 方法(见下文)时,程序获取的是 JSONObject 而不是字符串。知道为什么会发生这种情况以及如何纠正吗?这是在 .get() 调用之后显示为对象值的内容:

{"access_level":"readonly","address":"9997-dlsrir-b8aky4@mg.lmsnet.com","name":"123 N. MICHIGAN AVENUE CONDOMINIUM ASSOCIATION","created_at":"星期四, 2019 年 1 月 10 日 15:20:35 -0000","description":"","members_count":1}

public MailingList( ClientResponse responseContactList )
    {
        try
        {
            System.out.println( "Begin MailingList Constructor!" );
            String tempStr = responseContactList.getEntity(String.class);
            JSONObject aJSONObject = new JSONObject( tempStr );
            aJSONObject = new JSONObject( aJSONObject.getString( "list" ) );
            createdAt = aJSONObject.getString( "created_at" );
            address = aJSONObject.getString( "address" );
            membersCount = Long.parseLong( aJSONObject.getString( "members_count" ) );
            description = aJSONObject.getString( "description" );
            name = aJSONObject.getString( "name" );

        } catch( Exception e )
        {
            e.printStackTrace();
            isValid = false;
        }
        isValid = true;
        System.out.println( "End MailingList Constructor!" );
    }


   /**
     * Get the string associated with a key.
     *
     * @param key
     *            A key string.
     * @return A string which is the value.
     * @throws JSONException
     *             if there is no string value for the key.
     */
    public String getString(String key) throws JSONException {
        Object object = this.get(key);
        if (object instanceof String) {
            return (String) object;
        }
        throw new JSONException("JSONObject[" + quote(key) + "] not a string.");
    }

【问题讨论】:

  • 返回的对象是 JSONObject,而不是 String。如果最近开始出现这种情况,则 API 发生了变化。
  • 我也这么认为,但我的生产代码仍然运行良好。就好像 org.json 代码被更改了一样。知道如何解决这个问题吗?

标签: java json


【解决方案1】:

似乎 2011 年 5 月的这一变化可能是导致行为不同的可能原因。

https://github.com/stleary/JSON-java/commit/f4cb14728f13629972a0ea76bb3dc0705a735fa8

查看第 634 行。过去的 toString 方法看起来像这样,它会给你正确的结果:

 Object object = get(key);
 return object == NULL ? null : object.toString();

您必须在 2011 年之前拥有 JSON 库,并且最近更新到较新的版本

为了使用最新的库,请尝试更改

 aJSONObject = new JSONObject( aJSONObject.getString( "list" ) ); 

 aJSONObject = aJSONObject.getJSONObject( "list" );

【讨论】:

  • 我从备份中恢复了 jar 文件,它工作正常。奇怪的是它的日期是 03/2013。感谢您为我指明正确的方向。关于如何使用更新的代码纠正此问题的任何想法?
  • 代替aJSONObject = new JSONObject( aJSONObject.getString( "list" ) );试试aJSONObject = aJSONObject.getJSONObject( "list" );
  • 我这样做了,它返回 { "empty:false" }
  • 你可以试试aJSONObject = new JSONObject( aJSONObject.get( "list" ).toString() );
【解决方案2】:

我认为aJSONObject.getJSONObject( "list" ) 是一个嵌套对象,因为对于你的 json,它不是数组。如果它是一个列表,那么括号 [ ] 应该是方括号。 aJSONObject.getJSONArray("list").

【讨论】:

  • 当我调用 getJSONOjbect("list") 它返回 {"empty:false"} 当我调用 getJSONArray("list") 它说它不是一个数组,就像 getString 不是一个字符串一样。 org.json 代码最近是否可能更改?
猜你喜欢
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多