可以接受哪种字符串格式来附加到此JSON输出?

时间:2014-07-22 00:58:02

标签: javascript jquery json json.net

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

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

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

REST调用的输出

  

&#34; {\&#34; SA \&#34;:[\&#34; BHDQ9TLPeaeVuSSgXv9bsOIVFUWbOpivMKhGki7YPLzIXEyHuxRAZhDgts2sEcBQpLBuKJZCtcmSlzWZ9iK0AAA = \&#34; \&#34; BAhyo7T0Wq1WBLXnyN4vo1L94rWLhCCv4DqROi + p9XHO6UeS0Gw6xh1JAKOtXBU2fA432LkNqng8cUt1eAX0bqs = \&#34; \ &#34; BGFmyTreWY5pICAcf3itoqbfhs5brOmIDLNF3V7p7slPYdCSVhwWUT5mHD6Lb5kNi \ / Qy9tracNUtVgvo3f51FrI = \&#34; \&#34; BMV7RIwoz + LdFgD2fq7UZ7E88KFq \ / 03381NDYFIKYgUKxEzuXoj6hZfSB0slX5fdaL44Lf6i \ / UjDzPQt2XUG8NE = \&#34; \&#34; BL8BnU5WvFn7vIlKi14dWsqykNf1 \ / nmE55YXFGwLx9Qu3VvDblULt \ / U8CXPI1vD8 + wMXCRnkunXqxlsFqgghf8w = \&#34],\&#34; SB \&#34;:[\&#34; BInTtgTAn \ / zkmrkporhV5DvPZRq5YWm8e \ / m02oq55UfY3RxIhOplJgwLjgKMHKYDthYEBcqNNNuVbbWnbtKVAqA = \&#34; \&#34; BJbh5y95wHGjmAPDFNqgewnBxtqVke0sloDD2S3IdrWZ95JfP77rtXZ4lTG8g9PuTLJbl4exZUnM16260WxJ9wU = \&# 34; \&#34; BKevE9i2J8CicXHX3elCoQPEpTOmJyGOlBskIbFMFGQFhJ5TD7N1221rhhH9HY6DsfRojmefozsQYzo7Pokp +汞柱= \&#34; \&#34; BJbVTRyh8WwCxfR7jRXnran4td7k5 + vEfM + HWxeAibneSjdMRQ1Fg6QxKLu + Zu1aPdXqD8M29kABOTAiYopVuQE = \&#34; \&#34; BFv3alDqjo7ckdB2vuxJ15Gur1xsgATjLe9d室温\ / XU9AkbN + AELCv + mF1Xy8 + 83L2A1p8aGxF4b7dsrMed27u1j4 = \&#34],\&#34; SZ \&#34;:\&#34; BF1IiqMz0KmT4gZN6euJquWFt2UmVjyOEdaX0jH8uQMAPG8DBoyneT2PJ9NQTE2xBOP9TtAb1d2O + iCojFqzkvI = \&#34;}&#34; < / p>

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

最终用途是Chrome和Firefox插件

2 个答案:

答案 0 :(得分:3)

好吧,如果我正确理解:

您从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建议):

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

转换回JSON字符串。

var jsn = JSON.stringify(o);

答案 1 :(得分: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"
    }
    

    您可以通过data访问response.data

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

    当前响应是一个对象,只有几种方法可以修改它:

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

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

      [{}, {}]
      

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

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

      {data:{}, guid: ""}