【问题标题】:JSON iteration in php using data sent by java/android使用 java/android 发送的数据在 php 中进行 JSON 迭代
【发布时间】:2020-11-29 10:42:36
【问题描述】:

从我的 android 我的 PHP 服务器正在接收以下 json:

{
  "class":"SURESHOT",
  "subject":"Maths",
  "qstn":"[607421_15958169393.JPG, 410816_15958169444.JPG, 
          655502_15958169495.JPG,   625421_15958179086.JPG, 
          625421_15958179086.JPG, 461984_15958180457.JPG]",
  "ans":"[C, B, A, D, C, C]",
  "lickey":"jg2ler3xvbdgsjkru12tutujghgjgl4jkjojuir8uttzcdadasretf",
  "user":"1000",
  "result":"[fail,fail, pass, fail, fail, fail]",
  "qid":"[37, 38, 39, 40, 40, 41]"
 }

现在在 PHP 中无法遍历数据。 'qstn'、'ans' 和 'result' 是有问题的。我们如何才能正确地做到这一点?

我使用json_encode(($_POST),true);进行初步数据转换。

这是我运行以获取 JSON 的代码:

这是我得到 json 的代码。

   reqPostanswers = new StringRequest(Request.Method.POST, urll,new  Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //Log.i("posting info :",response.toString());
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //Log.i("posting error  :",error.toString());
        }
    }){

        @Override
        protected Map<String,String> getParams(){
            Map<String,String> params = new HashMap<String, String>();
            params.put("subject",subject);
            params.put("class",qSet[qsetCntr][0]);
            params.put("user", thisuser);
            params.put("result",resltn.toString());
            params.put("qstn",qstnn.toString());
            params.put("qid", qiddn.toString());
            params.put("ans",answn.toString());
            params.put("lickey","jg2ler3xvbdgsjkru12tutujghgjgl4jkjojuir8uttzcdadasretf");

            return params;
        }

    };
    answerpostQueue = Volley.newRequestQueue(getApplicationContext());
    answerpostQueue.add(reqPostanswers);

婴儿车设置中的数组或变量仅是 Arraylists。

【问题讨论】:

  • 你能展示创建这个有问题的 JSON 的代码吗?
  • @Joni,我已经添加了代码。

标签: java php android json


【解决方案1】:

Android 代码实际上并未将 JSON 发送到服务器。它使用旧的键值表单字段格式,无法表示复杂的对象。要解决此问题,请将 Android 代码更改为使用 JsonObjectRequest 而不是 StringRequest,并将请求作为 JSONObject 传递:

JSONObject params = new JSONObject();
params.put("subject",subject);
params.put("class",qSet[qsetCntr][0]);
params.put("user", thisuser);
params.put("result", new JSONArray(resltn));
params.put("qstn", new JSONArray(qstnn));
params.put("qid", new JSONArray(qiddn));
params.put("ans", new JSONArray(answn));
params.put("lickey","jg2ler3xvbdgsjkru12tutujghgjgl4jkjojuir8uttzcdadasretf");

reqPostanswers = new JsonObjectRequest(Request.Method.POST, urll, params,
    new  Response.Listener<String>() { ... },
    new Response.ErrorListener() { ... }
});

完成此更改后,您很可能还必须更改 PHP 代码,以便它从请求正文中读取 JSON。例如,这里解释了如何做到这一点:https://www.geeksforgeeks.org/how-to-receive-json-post-with-php/

【讨论】:

  • 你做到了。谢谢。这是一个很大的帮助。整个问题仍然没有解决。
  • 这是我为了成功而必须使用的 php 部分。 $json = file_get_contents('php://input'); $decoded=json_decode($json,true);所以 $decoded 是一个合格的 php 数组。
【解决方案2】:

首先问题在于您创建的 json。 Json数组应该如下图,

"qstn": ["607421_15958169393.JPG","410816_15958169444.JPG",
      "655502_15958169495.JPG","625421_15958179086.JPG","625421_15958179086.JPG", 
"461984_15958180457.JPG"]

以上面显示的方式转换你的json数组并在php端使用,

$model = json_decode($json,true);

现在您可以访问此变量的值,如下所示:

 $class = $model["class"];
 //The 0th index of qstn array can be accessed as
 $qsnt1 = $model["qstn"][0];

为了避免将来出现此类错误,请使用 gson 为您创建 json。

【讨论】:

    【解决方案3】:

    使用ltrimrtrim函数从字符串中删除[],然后使用explode可以将字符串转换为数组。 注意:此示例仅在分隔符为 , 和空格 (", ") 时有效

    "qstn"为例:

    $array = json_decode($json, true);
    
    $resultArray = explode(", ",rtrim(ltrim($array["qstn"],"["),"]"));
    
    var_dump($resultArray);
    

    【讨论】:

    • 谢谢。但是从 java 数组创建复杂 JSON 的最佳方法是什么?
    • 我没明白你的意思从java数组创建复杂的JSON
    • 我的问题不合格。对不起。
    猜你喜欢
    • 2013-07-30
    • 2022-01-19
    • 2013-11-03
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多