【问题标题】:What String format is acceptable to append to this JSON output?什么字符串格式可以附加到这个 JSON 输出?
【发布时间】:2014-07-22 00:58:02
【问题描述】:

我有一个现有的“黑盒”网络服务。我需要在该输出的末尾附加一个会话 ID,以便 Javascript 和类似客户端可以恢复有状态会话。

鉴于下面的输出,附加或前置任意 GUID 的正确语法是什么,以便可以将其正确反序列化为有效的 JSON?

注意下面这个数据是完美的。如果我能以某种方式添加一个“可移动”的信息,使用 JSON.NET 字符串 GUID,那将是理想的。

REST 调用的输出

“{\” SA \ “:[\” BHDQ9TLPeaeVuSSgXv9bsOIVFUWbOpivMKhGki7YPLzIXEyHuxRAZhDgts2sEcBQpLBuKJZCtcmSlzWZ9iK0AAA = \ “\ ”BAhyo7T0Wq1WBLXnyN4vo1L94rWLhCCv4DqROi + p9XHO6UeS0Gw6xh1JAKOtXBU2fA432LkNqng8cUt1eAX0bqs = \“ \ ”BGFmyTreWY5pICAcf3itoqbfhs5brOmIDLNF3V7p7slPYdCSVhwWUT5mHD6Lb5kNi \ / Qy9tracNUtVgvo3f51FrI = \“ \” BMV7RIwoz + LdFgD2fq7UZ7E88KFq \ / 03381NDYFIKYgUKxEzuXoj6hZfSB0slX5fdaL44Lf6i \ / UjDzPQt2XUG8NE = \ “\ ”BL8BnU5WvFn7vIlKi14dWsqykNf1 \ / nmE55YXFGwLx9Qu3VvDblULt \ / U8CXPI1vD8 + wMXCRnkunXqxlsFqgghf8w = \“],\ ”SB \“:[\ ”BInTtgTAn \ / zkmrkporhV5DvPZRq5YWm8e \ / m02oq55UfY3RxIhOplJgwLjgKMHKYDthYEBcqNNNuVbbWnbtKVAqA = \“ \ ”BJbh5y95wHGjmAPDFNqgewnBxtqVke0sloDD2S3IdrWZ95JfP77rtXZ4lTG8g9PuTLJbl4exZUnM16260WxJ9wU = \“ \” BKevE9i2J8CicXHX3elCoQPEpTOmJyGOlBskIbFMFGQFhJ5TD7N1221rhhH9HY6DsfRojmefozsQYzo7Pokp +汞柱= \ “\ ”BJbVTRyh8WwCxfR7jRXnran4td7k5 + vEfM + HWxeAibneSjdMRQ1Fg6QxKLu + Zu1aPdXqD8M29kABOTAiYopVuQE = \“ \ ”BFv3alDqjo7ckdB2vuxJ15Gur1xsgATjLe9drt \ / XU9AkbN + AELCv + mF1Xy8 + 83L2A1p8aGxF4b7dsrMed27u1j4 = \“],\ ”SZ \“:\” BF1IiqMz0KmT4gZN6euJquWFt2UmVj yOEdaX0jH8uQMAPG8DBoyneT2PJ9NQTE2xBOP9TtAb1d2O+iCojFqzkvI=\"}"

上面的输出来自 Chrome。我不确定 Chrome 是否添加了额外的引号等,但是当我在服务器上调试 System.String 时,我看到同样的东西被发送到 WCF 服务。

最终用途将是 Chrome 和 Firefox 插件

【问题讨论】:

  • 可以在浏览器的控制台打印吗?
  • @Tom - 从未以这种方式与 JS 进行交互。我只是使用 GET 浏览服务。我该怎么办?
  • 我想你必须在上面使用JSON.parse() 之类的东西,然后根据需要编辑对象,然后使用JSON.stringify() 将其取回。
  • 我刚刚使用远程调试器检查了服务器,就在它发送到客户端之前。输出是相同的,所以我认为没有必要为此使用控制台。

标签: javascript jquery json json.net


【解决方案1】:

如果我理解正确的话:

您从blackbox 服务获取 JSON。它包含一些属性和值。您想添加一个带有一些 GUID 的新属性并将其发送到浏览器。

如果正确,请尝试以下操作:

var json=<WHAT YOU GET FROM SERVICE>;
var converter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);
obj.sid="this is the new session id"; //ADD NEW PROPERTY


var j=JsonConvert.SerializeObject(obj); //GET BACK JSON STRING WITH NEW PROPERTY

如果您只想在客户端(在您的插件中)添加会话 ID,请使用 JSON2 javascript 库并使用以下代码(正如 Josh 在 cmets 中所建议的那样):

var o = JSON.parse(<REST OUTPUT>);
o.sid = <YOUR SESSION ID>;

转换回JSON 字符串。

var jsn = JSON.stringify(o);

【讨论】:

  • 是否需要DeserializeObject?另一个答案只是创建一个新对象。那另一种方式会双重编码数据吗?
  • @makerofthings7 你是对的。在我的回答中,我假设 foo 是反序列化的响应,否则您会将 JSON 数据编码为字符串。
  • 接受这个答案,因为如果我要在客户端解析两次,或者在客户端和服务器上解析一次,我选择后者。 (移动设备是我的目标)
【解决方案2】:

在不破坏现有客户端的情况下,无法修改该特定响应。如果您可以破坏现有客户端,或者如果您正在使用您控制的客户端,您可以将对象包装在另一个对象中,设置两个键:GUIDdata。例如:

var json = JsonConvert.SerializeObject(new {
    data = foo,
    GUID = bar,
});

bar 是您要使用的 GUID,foo 是以下两种情况之一:

  1. 响应中的 JSON 字符串。这将导致最终对象如下所示:

    {
        data: "{\"sa\":[\"BHDQ9TLPeaeVuSSgXv9bsOIVFUWbOpivMKhGki7YPLzIXEyHuxRAZhDgts2sEcBQpLBuKJZCtcmSlzWZ9iK0AAA=\",\"BAhyo7T0Wq1WBLXnyN4vo1L94rWLhCCv4DqROi+p9XHO6UeS0Gw6xh1JAKOtXBU2fA432LkNqng8cUt1eAX0bqs=\",\"BGFmyTreWY5pICAcf3itoqbfhs5brOmIDLNF3V7p7slPYdCSVhwWUT5mHD6Lb5kNi\/Qy9tracNUtVgvo3f51FrI=\",\"BMV7RIwoz+LdFgD2fq7UZ7E88KFq\/03381NDYFIKYgUKxEzuXoj6hZfSB0slX5fdaL44Lf6i\/UjDzPQt2XUG8NE=\",\"BL8BnU5WvFn7vIlKi14dWsqykNf1\/nmE55YXFGwLx9Qu3VvDblULt\/U8CXPI1vD8+wMXCRnkunXqxlsFqgghf8w=\"],\"sb\":[\"BInTtgTAn\/zkmrkporhV5DvPZRq5YWm8e\/m02oq55UfY3RxIhOplJgwLjgKMHKYDthYEBcqNNNuVbbWnbtKVAqA=\",\"BJbh5y95wHGjmAPDFNqgewnBxtqVke0sloDD2S3IdrWZ95JfP77rtXZ4lTG8g9PuTLJbl4exZUnM16260WxJ9wU=\",\"BKevE9i2J8CicXHX3elCoQPEpTOmJyGOlBskIbFMFGQFhJ5TD7N1221rhhH9HY6DsfRojmefozsQYzo7Pokp+Hg=\",\"BJbVTRyh8WwCxfR7jRXnran4td7k5+vEfM+HWxeAibneSjdMRQ1Fg6QxKLu+Zu1aPdXqD8M29kABOTAiYopVuQE=\",\"BFv3alDqjo7ckdB2vuxJ15Gur1xsgATjLe9drt\/XU9AkbN+AELCv+mF1Xy8+83L2A1p8aGxF4b7dsrMed27u1j4=\"],\"sz\":\"BF1IiqMz0KmT4gZN6euJquWFt2UmVjyOEdaX0jH8uQMAPG8DBoyneT2PJ9NQTE2xBOP9TtAb1d2O+iCojFqzkvI=\"}",
        guid: "00000000-0000-0000-0000-000000000000"
    }
    

    您可以通过两次调用JSON.parse(或等效项)来获取数据。

  2. 来自 JSON 响应的反序列化对象。这将导致最终对象看起来像这样(为简洁起见删除了大部分数据):

    {
        data: {
            sa: [],
            sb: [],
            sz: ""
        },
        guid: "00000000-0000-0000-0000-000000000000"
    }
    

    您可以通过response.data 访问data

为什么任何修改都会破坏现有客户端

如果当前响应是一个对象,那么修改它的方法只有几种:

  1. 将密钥注入对象。这假设没有客户端使用Object.keys() 或以任何方式迭代密钥集(例如for (k in obj))。虽然这可能是正确的,但这是一个假设。

  2. 在末尾添加另一个对象:}, {。这样做需要将响应转换为数组:

    [{}, {}]
    

    这会破坏任何假定响应是对象的客户端。

  3. 将当前响应包裹在周围的对象中(如上所述)。这也会破坏任何假定响应结构的客户端。

    {data:{}, guid: ""}
    

【讨论】:

  • 为什么添加键/值对会破坏客户端?
  • @epascarello 已更新。
  • 这是否将foo 编码为字符串?还是 JSON 会被双重转义?
  • @makerofthings7 已更新。
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 2018-01-14
  • 2011-01-10
  • 2021-07-03
  • 2020-09-03
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多