【问题标题】:json array encode in php and decode in javascriptjson数组在php中编码并在javascript中解码
【发布时间】:2019-02-10 16:27:38
【问题描述】:

我有这个JSONPHP 编码:

{
    "id": "37",
    "user_id": "1",
    "account": "ssdv",
    "amount": "5002",
    "subject": "\u0647\u062f\u06cc\u0647",
    "tags": "[{\"ttt\"}]"
}

上述 json 的 php 数组为:

array (
  'id' => '37',
  'user_id' => '1',
  'account' => 'ssdv',
  'amount' => '5002',
  'subject' => 'هدیه',
  'tags' => '["ttt"]',
)

tags 索引是从 MySQL 表中读取的 JSON 数据类型,所以我不能更改 tags 的格式,它必须是 json 数组。

我已尝试通过此代码将第一个字符串解码为 json:

<script>
var obj = JSON.parse('{"id":"37","user_id":"1","account":"ssdv","amount":"5002","subject":"\u0647\u062f\u06cc\u0647","tags":"[{"ttt"}]"}');
</script>

但它会引发此错误:
Uncaught SyntaxError: Unexpected token t in JSON at position 86 at JSON.parse (&lt;anonymous&gt;)

如何在 javascript 中将此 json 解析为有效的 json?

更新

我的桌子是这样的:

id    user_id    account    amount    subject    tags

37    1          ssdv       5002      هدیه        ["ttt"]

tags 字段为 MySQL json 类型。

我获取这条记录并尝试对其进行 json_encode,tags 索引在编码后变为"tags":"[{"ttt"}]"。但是当我尝试 JSON.parse(myEncodedRecord) 时会导致错误。看起来tags 必须是这样的"tags":["ttt"]。我知道我可以通过 preg_replace() 实现这一点,但有没有更好的方法?

【问题讨论】:

  • 为什么不使用顶部显示的字符串?该字符串已正确编码(假设有一个结束 }...),您可以将其直接发送到 javascript,而无需引用和解析它。
  • 您在 tags 参数中嵌入了双引号。你必须逃离他们。
  • 您可以并且应该更改 MySQL json 格式。如果你通过 json_decode 运行它,你会得到一个普通的 PHP 数组,然后你可以把这个数组放在 'tags' 键中并 json_encode 整个事情,避免双重编码/解码的任何讨厌的问题。让我们知道情况如何。
  • 双引号没有被转义不是问题,Alexander说得对,在查询运行之前需要正确设置DB编码。
  • 请注意,当 json 编码时,您不会从 ["ttt"] 获得 [{\"ttt\"}],因为那将是无效的语法。相反,它会被编码为"tags":"[\"tt\"]"

标签: javascript php arrays json


【解决方案1】:
JSON.parse('{"id":"37","user_id":"1","account":"ssdv","amount":"5002","subject":"\u0647\u062f\u06cc\u0647","tags":["ttt"]}');

如果标签是数组,为什么需要{}。我删除了它们,我能够解析。 这在控制台中对我有用。在 try 中使用解析是安全的

如果标签是一个单一的实体,就像我们有 3 个标签,我们只需要显示它的名称,我们可以简单地将它作为一个数组。只有当我们需要显示多个属性时,我们才需要将其作为对象数组获取。 在第一种情况下,它会像

"tags":["tag1name", "tag2name","tag3name"]

如果它有多个属性

"tags":[{"name":"tag1name","type":"type1"},{"name":"tag2name","type":"type2"},{"name":"tag3name","type":"type3"}]

您可以在以下网站的帮助下验证您的 JSON 语法

https://jsonformatter.curiousconcept.com/

【讨论】:

  • 是 preg_replace 实现这一目标的最佳方式吗?
  • 除了你在 php.ini 中的输出。请显示php代码。我相信服务器端一定有问题。
  • 我更新问题,我只是使用选择查询来获取记录
【解决方案2】:

您的 JSON 字符串中有 2 个问题:

1.) 您不能将数组用作字符串。所以请将字符串"[{"ttt"}]"改为[{"ttt"}]

2.) 初始化对象时,不能单独指定索引。您还应该指定该值。因此,在上述要点中,请注意数组中的对象初始化。如果您只提供一个字符串,它会将其视为索引而不是值。这是 javascript 而不是 PHP。

所以你可以:

1.) Change the `[{"ttt"}]` to `[{"ttt":"test"}]`. That should work or
2.) Change the `[{"ttt"}]` to `[{"value":"ttt"}]` however you feel comfortable.

我已经考虑了第一个选项,所以你的结果字符串是:

var txt = '{"id":"37","user_id":"1","account":"ssdv","amount":"5002","subject":"\u0647\u062f\ u06cc\u0647","tags":[{"ttt":"test"}]}'

试试这个,如果您遇到任何问题,请告诉我。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    为了避免这个错误,我必须先解码 tags 字段值,然后编码整个数组

    代码:

    //get the record
    $record = $this->db->get_where('table', ['id' => $id])->row_array();
    
    //decode tags value
    $record['tags'] = json_decode($expense['tags']);
    
    //encode and use
    $record = json_encode($record);
    

    现在它是标准 JSON。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多