【问题标题】:Set variable value into json params - PHP将变量值设置为 json 参数 - PHP
【发布时间】:2021-07-14 22:16:12
【问题描述】:

我为我的 Salesforce 实例构建了一个休息集成。

当我发送固定的 json(没有变量值)时,它可以工作。但是我正在做一个概念验证,我需要将一些变量传递给 json,当我这样做时,什么也没有发生。

我认为我正在尝试做的事情是不可能的(我正在尝试的方式),但我没有找到任何可以帮助我理解如何将变量传递到 json 的材料。

然而,我所做的是:

我在 HTML 正文中创建了一个消息字段。

        <div class="wrap-input100 validate-input" data-validate = "Campo obrigatório">
            <span class="label-input100">Sua mensagem</span>
            <textarea class="input100" name="message" placeholder="Deixe aqui sua mensagem"></textarea>
            <span class="focus-input100"></span>
        </div>

然后,我检索该字段的值,并将其编码为 json

$mensagem = $_GET['message'];
$mens_json = json_encode($mensagem);

最后,我正在寻找这个变量 (["$mens_json"]) 并将其放入一个 json 参数中。

$params = ("{\"Fields\":[{\"Name\":\"requestDefinitionId\",\"Value\":\"a3Hf0000000lTNaEAM\"},{\"Name\":\"client\",\"Value\":\"0053j00000A7rWLAAZ\"}],\"Answers\":[{\"QuestionId\":\"a3Df0000000qI63EAE\",\"Values\":[\"Reclama\u00e7\u00e3o\"]},{\"QuestionId\":\"a3Df0000000qHvsEAE\",\"Values\":[\"$mens_json\"]},{\"QuestionId\":\"a3Df0000000qHwREAU\",\"Values\":[\"Web\"]}]}");

适用于 Postman 的主体与我保存在我的 php 代码中的主体相同。只是为了尝试整合。现在我将尝试使用变量创建 json。

{
  "Fields": [
    {
      "Name": "requestDefinitionId",
      "Value": "a3Hf0000000lTNaEAM"
    },
    {
      "Name": "client",
      "Value": "0053j00000A7rWLAAZ"
    }
  ],
  "Answers": [
    {
      "QuestionId": "a3Df0000000qI63EAE",
      "Values": [ "Reclamação" ]
    },
    {
      "QuestionId": "a3Df0000000qHvsEAE",
      "Values": [ "Solicitação de Serviço aberta por qualquer integração web" ]
    },
    {
      "QuestionId": "a3Df0000000qHwREAU",
      "Values": ["Web"]
    }
      ]
}

从这里编辑 修改后json_encode生成的json为:

{ "Fields": [ { "Name": "requestDefinitionId", "Value": "a3Hf0000000lTNaEAM" }, { "Name": "client", "Value": "0053j00000A7rWLAAZ" } ], "Answers": [ { "QuestionId": "a3Df0000000qI63EAE", "Values": [ "Reclamação" ] }, { "QuestionId": "a3Df0000000qHvsEAE", "Values": [ "RODRIGO BARCAT" ] }, { "QuestionId": "a3Df0000000qHwREAU", "Values": [ "Web" ] } ] }array(2) { ["Fields"]=> array(2) { [0]=> array(2) { ["Name"]=> string(19) "requestDefinitionId" ["Value"]=> string(18) "a3Hf0000000lTNaEAM" } [1]=> array(2) { ["Name"]=> string(6) "client" ["Value"]=> string(18) "0053j00000A7rWLAAZ" } } ["Answers"]=> array(3) { [0]=> array(2) { ["QuestionId"]=> string(18) "a3Df0000000qI63EAE" ["Values"]=> array(1) { [0]=> string(12) "Reclamação" } } [1]=> array(2) { ["QuestionId"]=> string(18) "a3Df0000000qHvsEAE" ["Values"]=> array(1) { [0]=> string(14) "RODRIGO BARCAT" } } [2]=> &array(2) { ["QuestionId"]=> string(18) "a3Df0000000qHwREAU" ["Values"]=> array(1) { [0]=> string(3) "Web" } } } }

我可以用来与 salesforce 集成的 json 如下所示:

("{\"Fields\":[{\"Name\":\"requestDefinitionId\",\"Value\":\"a3Hf0000000lTNaEAM\"},{\"Name\":\"client\",\"Value\":\"0053j00000A7rWLAAZ\"}],\"Answers\":[{\"QuestionId\":\"a3Df0000000qI63EAE\",\"Values\":[\"Reclama\u00e7\u00e3o\"]},{\"QuestionId\":\"a3Df0000000qHvsEAE\",\"Values\":[\"Solicita\u00e7\u00e3o de Servi\u00e7o aberta por qualquer integra\u00e7\u00e3o web\"]},{\"QuestionId\":\"a3Df0000000qHwREAU\",\"Values\":[\"Web\"]}]}");

我没有发现它发生的原因,或者我如何生成 json 作为我在上面粘贴的第二个。

谢谢

【问题讨论】:

  • 不要创建自己的 json,你总会遇到问题。相反,创建一个对象或数组,然后使用json_encode 来制作一个正确封装的字符串。
  • 我试过很多次,但总是出错。我将使用原始 json 正文更新帖子。但是我无法以正确的格式组装一个数组。我最后所做的是获取正文(我现在将其放在我的帖子中)并将其转换为您在变量 $params 中看到的结果。
  • 如果是原始的 JSON 体,那么你需要解码然后插入它,否则它会被双重编码
  • 我想我明白了,但这就是困难所在。该主体按预期工作,但具有固定数据。根据我的表格,我无法创建一个具有动态 json 的数组。谢谢你,艾恩伯
  • 我已经编辑了我的帖子并添加了新信息,开始于: EDITED FROM HERE 更改后,由 json_encode 生成的 json 是。你能帮我在编辑时如何格式化 json 吗?

标签: php json


【解决方案1】:

要扩展 aynber 的 cmets,您必须

  • 首先将您的 JSON 数据转换为数组(通过 json_decode()
  • 然后将要插入的值插入到数组中
  • 然后将数组转回 JSON 字符串(通过 json_encode())。

所以,假设您要插入此值...

$message = "Solicitação de Serviço aberta por qualquer integração web";

...进入这个 JSON 字符串(为 readybillity 缩写)...

{
    "Fields": [
        ...
    ],
    "Answers": [
        {
            "QuestionId": "a3Df0000000qI63EAE",
            "Values": [
                "Reclamação"
            ]
        },
        {
            "QuestionId": "a3Df0000000qHvsEAE"
        },
        {
            "QuestionId": "a3Df0000000qHwREAU",
            "Values": [
                "Web"
            ]
        }
    ]
}

...你需要这样做:


// Step 1: Turn your raw JSON data into an array
$data = json_decode($json, true);

// Step 2: Loop the data until you've found the piece of data you want to append to
foreach ($data['Answers'] as &$answer) {

    // For the question id, you'll want to define a variable up front
    if ($answer['QuestionId'] == 'a3Df0000000qHvsEAE') { 

        $answer['Values'] = [$message]; // Step 3: Insert what you want to insert
    }
}

// Step 3: Turn the array back into JSON
echo(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));

这给了你:

{
    "Fields": [
        ...
    ],
    "Answers": [
        {
            "QuestionId": "a3Df0000000qI63EAE",
            "Values": [
                "Reclamação"
            ]
        },
        {
            "QuestionId": "a3Df0000000qHvsEAE",
            "Values": [
                "Solicitação de Serviço aberta por qualquer integração web"
            ]
        },
        {
            "QuestionId": "a3Df0000000qHwREAU",
            "Values": [
                "Web"
            ]
        }
    ]
}

我设置了两个 json_encode() 标志 (JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) 只是为了提高可读性,您可以放心地将它们排除在外。

【讨论】:

  • 嗨,各位。谢谢你,并为延误道歉。我已经按照您所说的进行了更改,现在该值已附加到 json。只是多了一个问题。当我尝试集成时,生成的 json 给了我一个错误。 string(225) "[{"errorCode":"APEX_ERROR","message":"System.JSONException: 数值中的意外字符 ('-' (code 45)): 预期数字 (0-9) 跟在减号后面, 对于输入位置 [1,3] 的有效数值\n\n(系统代码)"}]"
  • 我会更新主帖,把生成的 json 和我可以集成的那个放在一起。它们是不同的。
猜你喜欢
  • 2020-05-08
  • 2013-06-05
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多