【问题标题】:JSONObject text must begin with '{' errorJSONObject 文本必须以 '{' 开始错误
【发布时间】:2017-05-15 13:01:03
【问题描述】:

我想从以下正文中获取“名称”的值:

[
  {
    "name": "ENTITY_CHANNELS",
    "description": "The list of channels use to deliver through.",
    "metadata": "{}"
  },
  {
    "name": "INTAKE_SFTP",
    "description": null,
    "metadata": "{\n  \"fields\":[\n    {\n      
\"field_name\":\"user_uat\",\n      \"field_type\":\"string\",\n      
\"field_required\":true, \n\t  \"field_description\": \"UAT User name\"\n    
},\n    {\n      \"field_name\":\"user_prod\",\n      
\"field_type\":\"string\",\n      \"field_required\":false, \n\t  
\"field_description\": \"Production User name\"\n    },\n    {\n      
\"field_name\":\"folder\",\n      \"field_type\":\"string\",\n      
\"field_required\":true, \n\t  \"field_description\": \"Folder\"\n    },\n    
{\n      \"field_name\":\"address_UAT\",\n      \"field_type\":\"string\",\n      
\"field_required\":true, \n\t  \"field_description\": \"UAT address\"\n    
},\n    {\n      \"field_name\":\"address_PROD\",\n      
\"field_type\":\"string\",\n      \"field_required\":false, \n\t  
\"field_description\": \"Production address\"\n    },\n    {\n      
\"field_name\":\"port\",\n      \"field_type\":\"integer\",\n      
\"field_required\":true, \n\t  \"field_description\": \"Port\"\n    },\n    
{\n      \"field_name\":\"protocol_version\",\n      
\"field_type\":\"version\",\n      \"field_required\":false, \n\t  
\"field_description\": \"Protocol version\"\n    }\n  ]\n}"
  }
]

我试过以下代码:

String settingsTypeData = response.body().toString();
JSONObject settingsTypeObject = new JSONObject(settingsTypeData);
Assert.assertEquals(settingsTypeObject.get("name"), "ENTITY_CHANNELS");

但我不断收到错误消息:JSONObject 文本必须以 '{' 错误开头。我想提取“名称”的值。有人可以帮我吗?

【问题讨论】:

  • 由于外括号是方括号,也许您应该使用 JSONArray,而不是 JSONObject。或者您可以删除外部 []。
  • 您的输入是一个包含两个 JSONObjects 的 JSONArray
  • 正如已经指出的那样:您正在尝试将 array 解析为 object ,因此解析器会抱怨。因此,您最好按照 Henry 的建议将数组解析为数组(即 JSONArray),然后对该数组的元素进行操作。
  • JSON 无效。尝试使用一些 JSON 验证器。
  • @MehrajMalik:我怀疑这只是将其粘贴到问题中的人工制品,但是是的,H.Avram - 如果我们将该 JSON 复制并粘贴到验证器中,它会失败。您似乎已经将实际的 JSON 与其完整的字符串表示形式结合在一起,包括 \n\t

标签: java arrays json


【解决方案1】:

感谢大家的意见。我意识到我的错误是什么。我用过:

String settingsTypeData = response.body().toString();

下面的代码将解决我的问题:

String settingsTypeData = response.body().string();
    JSONArray settingsTypeArray = new JSONArray(settingsTypeData);

    String firstSettingType = settingsTypeArray.getJSONObject(0).getString("name");
    Assert.assertEquals(firstSettingType, "ENTITY_CHANNELS");

    String secondSettingType = settingsTypeArray.getJSONObject(1).getString("name");
    Assert.assertEquals(secondSettingType, "INTAKE_SFTP");

【讨论】:

    【解决方案2】:

    使用 JSONArray 而不是 JSONObject, 因为上面的whole-json就是JSONArray。 然后迭代这个 JSONArray 并从每个 JSONObject 中获取名称

       String settingsTypeData = response.body().toString();
       try {
            JSONArray settingsTypeArray = new JSONArray(settingsTypeData);
            for(int i=0;i<settingsTypeArray.length();i++){
                String name = settingsTypeArray.getJSONObject(i).getString("name");
                Log.d(TAG, "onActivityResult: name = "+name);
            }
        } catch (JSONException jex){
            jex.printStackTrace();
        }
    

    【讨论】:

    • JSON 本身无效,它会做出什么改变?
    • thanku @mehraj malik 是的 json 无效...我看到的是在 json 创建时,元数据的值是字符串化并推送到元数据字段。这是错误的,因此这一切都发生了...我也认为这可能是有效的 json 并且转义序列是由编译器或调试器添加的,它在 IDE 控制台上以这种方式打印。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多