【问题标题】:MySQL JSON_INSERT() of an Array into Object creates Escape charactersMySQL JSON_INSERT() 的 Array into Object 创建转义字符
【发布时间】:2022-01-18 05:29:27
【问题描述】:

MySQL v8.

下面这行代码:

SELECT JSON_INSERT(@varJSON, '$.recordings', @recordedJSON) INTO @varJSON;

将 JSON 数组插入 JSON 对象。但是,这样做时也会引入转义字符。

/*Outputs*/

/* @varJSON before - Correct format. */
{"routeName": "INDIA", "routeNotes": "This is an area that must be reviewed and remarked out."}
 
/* @recordedJSON - Correct format.*/
[{"sessionID": "7811a89a-58b8-11ec-8172-42010ac00007", "recordedGeom": {"type": "LineString", "coordinates": [[-35.1235, 139.1234], [-36.1235, 139.1234], [1.234, 5.5456], [1.234, 149.1234]]}, "recordingEnd": null, "applianceName": "The Basin - Pumper", "recordingStart": "2021-12-10 01:58:17.000000", "applianceBrigade": "The Basin"}, {"sessionID": "another_test_test_test_", "recordedGeom": {"type": "LineString", "coordinates": [[-34.920281, 138.606703], [-34.922584, 138.607913]]}, "recordingEnd": null, "applianceName": "The Basin - Pumper", "recordingStart": "2021-12-14 21:50:37.000000", "applianceBrigade": "The Basin"}]

SELECT JSON_INSERT(@varJSON, '$.recordings', @recordedJSON) INTO @varJSON;
/*Note - I receive the same output format in JSON_SET*/


/*MySQL then inputs escape slashes in when I am using the code above.*/

{"routeName": "INDIA", "recordings": "[{\"sessionID\": \"7811a89a-58b8-11ec-8172-42010ac00007\", \"recordedGeom\": {\"type\": \"LineString\", \"coordinates\": [[-35.1235, 139.1234], [-36.1235, 139.1234], [1.234, 5.5456], [1.234, 149.1234]]}, \"recordingEnd\": null, \"applianceName\": \"The Basin - Pumper\", \"recordingStart\": \"2021-12-10 01:58:17.000000\", \"applianceBrigade\": \"The Basin\"}, {\"sessionID\": \"another_test_test_test_\", \"recordedGeom\": {\"type\": \"LineString\", \"coordinates\": [[-34.920281, 138.606703], [-34.922584, 138.607913]]}, \"recordingEnd\": null, \"applianceName\": \"The Basin - Pumper\", \"recordingStart\": \"2021-12-14 21:50:37.000000\", \"applianceBrigade\": \"The Basin\"}]", "routeNotes": "This is an area that must be reviewed and remarked out."}

我已多次阅读此文档,但看不出哪里/哪里出了问题:

https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#function_json-set https://dev.mysql.com/doc/refman/8.0/en/json.html#json-normalization

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用JSON_UNQUOTEmanual

    /*Outputs*/
    
    /* @varJSON before - Correct format. */
    SET @varJSON :=  '{"routeName": "INDIA", "routeNotes": "This is an area that must be reviewed and remarked out."}';
     
    /* @recordedJSON - Correct format.*/
    SET @recordedJSON := '[{"sessionID": "7811a89a-58b8-11ec-8172-42010ac00007", "recordedGeom": {"type": "LineString", "coordinates": [[-35.1235, 139.1234], [-36.1235, 139.1234], [1.234, 5.5456], [1.234, 149.1234]]}, "recordingEnd": null, "applianceName": "The Basin - Pumper", "recordingStart": "2021-12-10 01:58:17.000000", "applianceBrigade": "The Basin"}, {"sessionID": "another_test_test_test_", "recordedGeom": {"type": "LineString", "coordinates": [[-34.920281, 138.606703], [-34.922584, 138.607913]]}, "recordingEnd": null, "applianceName": "The Basin - Pumper", "recordingStart": "2021-12-14 21:50:37.000000", "applianceBrigade": "The Basin"}]';
    
    SELECT JSON_INSERT(JSON_UNQUOTE(@varJSON), '$.recordings', JSON_UNQUOTE()@recordedJSON)) INTO @varJSON;
    /*Note - I receive the same output format in JSON_SET*/
    
    SELECT @varJSON;
    /*Note - I receive the same output format in JSON_SET*/
    
    | @varJSON | | :------------------------------------------------- ---------------------------------------------- | | {"routeName": "INDIA", "routeNotes": "这是一个必须审查和备注的区域。"} | ✓

    db小提琴here

    【讨论】:

    • 我刚回到这里向自己提出一个不同的答案,我将类型转换为 JSON:SELECT JSON_SET(@varJSON, '$.recordings', CAST(@recordedJSON AS JSON));也返回首选格式。转换类型和您对 JSON_UNQUOTE 的建议有区别吗?
    • CAST 通常比较慢
    • 完美,谢谢nbk!
    【解决方案2】:

    除了 @nbk 之外,我刚刚发现将另一个变量转换为 JSON 也可以。

    SELECT JSON_SET(@varJSON, '$.recordings', CAST(@recordedJSON AS JSON));
    {"routeName": "INDIA", "recordings": [{"sessionID": "7811a89a-58b8-11ec-8172-42010ac00007", "recordedGeom": {"type": "LineString", "coordinates": [[-35.1235, 139.1234], [-36.1235, 139.1234], [1.234, 5.5456], [1.234, 149.1234]]}, "recordingEnd": null, "applianceName": "The Basin - Pumper", "recordingStart": "2021-12-10 01:58:17.000000", "applianceBrigade": "The Basin"}, {"sessionID": "another_test_test_test_", "recordedGeom": {"type": "LineString", "coordinates": [[-34.920281, 138.606703], [-34.922584, 138.607913]]}, "recordingEnd": null, "applianceName": "The Basin - Pumper", "recordingStart": "2021-12-14 21:50:37.000000", "applianceBrigade": "The Basin"}], "routeNotes": "This is an area that must be reviewed and remarked out."}
    

    我不知道一个是否比另一个性能更好 - 这可能会帮助将来遇到类似但不同问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-16
      • 2022-12-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多