我有一个" 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插件
答案 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)
在不破坏现有客户端的情况下,无法修改该特定响应。如果您可以破坏现有客户端,或者您正在使用您控制的客户端,则可以将该对象包装在另一个对象中,设置两个密钥:GUID
和data
。例如:
var json = JsonConvert.SerializeObject(new {
data = foo,
GUID = bar,
});
bar
是您要使用的GUID,foo
是以下两种情况之一:
响应中的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
(或等效的)来获取数据。
来自JSON响应的反序列化对象。这将导致最终对象看起来像这样(为了简洁起见,删除了大多数数据):
{
data: {
sa: [],
sb: [],
sz: ""
},
guid: "00000000-0000-0000-0000-000000000000"
}
您可以通过data
访问response.data
。
当前响应是一个对象,只有几种方法可以修改它:
将键注入对象。这假设没有客户使用Object.keys()
或以任何方式迭代密钥集(例如for (k in obj)
)。虽然可能是真的,但这是一个假设。
在最后添加另一个对象:}, {
。这样做需要将响应转换为数组:
[{}, {}]
这会破坏任何假定响应是对象的客户端。
将当前响应包装在周围的对象中(如上所述)。这也打破了任何假定响应的特定结构的客户端。
{data:{}, guid: ""}