【问题标题】:Why we need to convert object to JSON when we send data to back-end server?为什么我们在向后端服务器发送数据时需要将对象转换为 JSON?
【发布时间】:2018-03-11 19:22:09
【问题描述】:

我只知道我们以 JSON 格式从后端服务器获取数据。首先,为什么后端服务器返回 JSON(或过去的 XML),而不是对象?当我们要在客户端处理数据时,为什么我们需要将 JSON 转换为对象?同理,为什么我们要将数据发回后端服务器时需要将对象转换为 JSON?

这是一些引用引用 (https://stackoverflow.com/a/383699/8229192):“JSON Parser 还提供了另一个非常有用的方法,stringify。这​​个方法接受一个 JavaScript 对象作为参数,并输出一个 JSON 格式的字符串。当您想将数据发送回服务器时,这很有用:"

问题 1:为什么有用?

var anObject = {name: "Andreas", surname : "Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}

问题 2:为什么服务器端(后端)不能使用对象而必须使用 JSON?

问题 3:为什么客户端(前端)不能使用 JSON 却不得不反对?

【问题讨论】:

    标签: json


    【解决方案1】:

    在 JavaScript 中,可以将格式正确的 JSON 字符串转换为对象。要符合条件,它必须是正确的形状,如下所示:

    {
        "property1": "value1",
        "property2": "value2",
        "property3": "value3",
    }
    

    作为一个字符串,它看起来像这样:

    const json = "{ "property1": "value1", "property2": "value2", "property3": "value3" }"
    

    除了,你不能以这种方式使用引号,否则JavaScript解释器会搞砸,所以你必须转义它们:

    const json = "{ \"property1\": \"value1\", \"property2\": \"value2\", \"property3\": \"value3\" }"
    

    这就是实用程序JSON.stringify() 的作用。它将其变成运输安全的形状。当您想将其转换回对象时,请使用JSON.parse()

    在 JavaScript 中,你可能会这样做:

    const object = {
        name: 'Bob',
        age: 1337,
        color: 'neon brown'
    }
    
    // I would like to send this to the Frontend now:
    const preparedObject = JSON.stringify(object)
    
    // Send it to the Frontend now
    sendToFront({ payload: preparedObject })
    
    // Lets pretend the Frontend does this:
    const objectFromBackEnd = response.payload
    
    // The Frontend gets it, but it is just a string it can't do anything with, so now we need:
    const getObjectBack = JSON.parse(preparedObject)
    if (getObjectBack.name === 'Bob') {
        console.log('it worked')
    }
    // 'it worked'
    

    实际上,parse 的次数必须与 stringify 的次数完全相同,否则 JavsScript 将无法将字符串化对象转换回文字形式。

    我相信您可以想象如果双引号内的双引号内有双引号,它会变得多么混乱。 JavaScript 也会同样混乱。

    为了具体回答您的问题,后端(如果它使用 JavaScript)可以而且只能处理对象。前端也是如此,所以你的问题 2 和 3 的答案都是这样做的,但你必须确保它们被正确解释。

    如果你对一个非对象执行JSON.stringify(),它会抛出一个错误。

    如果您对格式不正确的 JSON 字符串执行 JSON.parse(),则会引发错误。

    JSON 是普遍优秀的,因为它为人类阅读者提供了超级友好的格式,对非 JavaScript 机器阅读者也超级友好。与 XML 和其他类型完成相同的事情相比,它对人类和机器都友好。

    您缺少的链接是您需要内化JSON.stringify()JSON.parse() 的工作方式。对它们进行一些测试,然后删除一些 ",: 字符,看看它们的反应如何。

    也试试这个:

        const object = {
            name: 'Bob',
            age: 1337,
            color: 'neon brown'
        }
    
        console.log('Test 1', JSON.stringify(object))
    
        console.log('Test 2', JSON.stringify(JSON.stringify(object)))
    
        console.log('Test 3', JSON.stringify(JSON.stringify(JSON.stringify(object))))
    
        //Now try adding this after:
    
        console.log(JSON.parse(JSON.parse(JSON.parse(JSON.stringify(JSON.stringify(JSON.stringify(object)))))))

    这对于任何编程语言来说都很强大,因为如果您的程序输出一个有效的 JSON 字符串,那么无论您如何创建它都无关紧要。我只是从我的 JavaScript 代码中执行 JSON.parse('string') 并开始使用点符号读取它并遍历 JSON“对象”中的所有内容。

    您可以在这里阅读更多内容:http://www.json.org/

    【讨论】:

    • 再次。你描述的很好。但又一次。为什么你必须使用json?以及为什么不能直接使用 javascript 对象在服务器和客户端之间传递数据。你不这么说。问题是为什么你必须使用它而不是如何使用。 asnware 是:'HTTP 不以二进制形式通信'
    • "JSON 是普遍优秀的,因为它为人类阅读者提供了超级友好的格式,对非 JavaScript 机器阅读者也超级友好。与 XML 和其他类型相比,它对人类和机器都友好完成同样的事情。”又是为什么?是的,它是用户友好的。但这并不能描述 wy?
    【解决方案2】:

    您所有问题的答案是:

    HTTP 不以二进制形式进行通信,因此您不能来回发送对象。相反,它们需要转换为一些基于文本的系统。 (Base64 很常见……还有其他)。

    JSON 不是必需的,但它在 HTTP 通信中很常见,因为它很容易与 JavaScript 对象相互转换。

    【讨论】:

    • 不确定谁投票给你。我投你一票。也请为我投票。谢谢。
    • 完成 - 不过,诚然,您的问题在本论坛中可能被视为“不确定”;它不是在问一个可以用特定代码回答的特定编程问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多