PHP json_在包含另一个jsonstring的jsonstring上解码

PHP json_在包含另一个jsonstring的jsonstring上解码,php,json,Php,Json,我正在为我们的软件开发一个日志工具,我遇到了一个json_解码返回null的问题,我希望得到一些帮助 json对象如下所示: { 'id': 'string', 'request': { 'headers': { ... }, 'body': 'jsonstring' }, 'response' { ... }, } 问题在于请求->身体部位。由于它是一个json对象

我正在为我们的软件开发一个日志工具,我遇到了一个json_解码返回null的问题,我希望得到一些帮助

json对象如下所示:

{
    'id': 'string',
    'request': {
        'headers': {
            ...
        },
        'body': 'jsonstring'
    },
    'response' {
        ...
    },
}
问题在于请求->身体部位。由于它是一个json对象,但保存为一个带引号的字符串,因此它似乎会弄乱json_decode函数,并返回null

编辑日志条目以删除请求中主体jsonstring周围的引号可以使其通过,但这就是它的日志记录方式,我并不期待可能需要重写日志记录代码。因此,在这一点上,任何帮助都是非常受欢迎的

编辑正在使用的真实JsonString。但是删除了身份验证和URL

{
    "payment_id": "1",
    "type": "post",
    "title": "Create Order",
    "request": {
        "headers": {
            "Content-type": "application/json",
            "Accept": "application/json",
            "Authorization": "string"
        },
        "method": "POST",
        "body": "{
            "order": {
                "items": [{
                    "reference": "8",
                    "name": "Test Product",
                    "quantity": 2,
                    "unit": "pcs",
                    "unitPrice": 12500,
                    "taxRate": 2500,
                    "taxAmount": 5000,
                    "grossTotalAmount": 25000,
                    "netTotalAmount": 20000
                }, {
                    "reference": "test",
                    "name": "Test",
                    "quantity": 1,
                    "unit": "pcs",
                    "unitPrice": 20000,
                    "taxRate": 2500,
                    "taxAmount": 5000,
                    "grossTotalAmount": 25000,
                    "netTotalAmount": 15000
                }, {
                    "reference": "1",
                    "name": "Flat rate",
                    "quantity": 1,
                    "unit": "pcs",
                    "unitPrice": 6125,
                    "taxRate": 2500,
                    "taxAmount": 1225,
                    "grossTotalAmount": 6125,
                    "netTotalAmount": 4900
                }],
                "amount": 56125,
                "currency": "SEK",
                "shipping": {
                    "costSpecified": true
                }
            },
            "checkout": {
                "url": "",
                "termsUrl": "",
                "shipping": {
                    "countries": [],
                    "merchantHandlesShippingCost": true
                },
                "consumerType": {
                    "supportedTypes": ["B2C"]
                }
            },
            "notifications": {
                "webHooks": [{
                    "eventName": "payment.reservation.created",
                    "url": "",
                    "authorization": ""
                }]
            }
        }"
    },
    "response": {
        "headers": {},
        "body": {
            "errors": {
                "notifications.WebHooks[0].Url": ["Field is not accepted as a valid URL"]
            }
        },
        "response": {
            "code": 400,
            "message": "Bad Request"
        },
        "cookies": [{
            "name": "visid_incap_1152497",
            "value": "2qY5gE/QT6W4CmOH1cLUuig yFsAAAAAQUIPAAAAAABsjnmr3oFW5wXzhutW3EWq",
            "expires": 1571353603,
            "path": "/",
            "domain": "api.dibspayment.eu"
        }, {
            "name": "incap_ses_273_1152497",
            "value": "hXtkOPG/TwEHQCnMhuTJAyg yFsAAAAALrqG9pupkT/7iEMdOohRTw==",
            "expires": null,
            "path": "/",
            "domain": "api.dibspayment.eu"
        }],
        "filename": null,
        "http_response": {
            "data": null,
            "headers": null,
            "status": null
        }
    }
}

使用jsonlint.com或类似的检查语法,如果json_decode返回null,那是因为无论您输入什么,它都不是有效的json。Protip,将数据解析为一个普通的php数组,并在最后对其进行json_编码。如果有传入的json数据,请使用

json_decode($json, true);
将其作为数组与对象进行处理。只使用数组并在事后对其进行enocde要容易得多

编辑:

"body": "{

是您的问题在看到完整字符串时,您在请求中的body对象之前添加了一个。在一个linter中解析它,它是一个无效的json对象,多亏了否决这个答案的人,自己去lint它:P

这不是一个有效的json字符串!JSON坚持使用双引号表示开始,所以一旦你对外部JSON字符串进行JSON解码,你就必须将JSON的内部片段作为一个单独的进程进行JSON解码使用jsonlint.com或类似的检查语法,上面的帖子是正确的,这是无效的JSONTH是真的,我道歉。我只是更习惯于用单引号来写作,并在撰写文章时使用单引号。这也是json字符串的一个截断版本,因为真正的字符串非常长,并且这个问题不需要大部分数据。但是你对如何解决我所问的问题有什么想法吗?@riggsfully但是在外部字符串上运行任何json_解码都会导致空返回,除非我删除内部字符串周围的注释。我怎样才能在外面运行它呢?谢谢你的回复。我们尽可能长时间地使用普通PHP数组。用于请求的函数使用用于请求的PHP数组,但是发送到API的主体需要是json字符串。这就是为什么在PHP数组中,我们将body设置为:$request['body]=json\u encode$request\u body;不幸的是,没有重写代码的某些部分,这就是它记录的格式。但是,如果没有办法绕过它,那么就需要像这样进行重写;应该把它解析成一个合适的json对象…,在上面编辑是的,我知道这就是问题所在,正如我在第一篇文章中提到的。但是你知道有什么办法可以解决这个问题吗?没有对代码进行大的重写,即:您使用什么来创建请求对象?看起来它不希望请求主体使用字符串,而是实际的object.Im,它使用一个函数返回一个包含头、方法和主体的PHP数组。只需将body设置为'body'=>json\u encode$this->request\u body,request\u body返回一个PHP数组。我不会手动添加任何引号。