在Fiddler中,我使用从客户端发送的以下cookie字符串捕获了HTTPS请求(在Inspectors> Raw中可见):
Cookie: devicePixelRatio=1; ident=exists; __utma=13103r6942.2918; __utmc=13103656942; __utmz=13105942.1.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); mp_3cb27825a6612988r46d00tinct_id%22%3A%201752338%2C%22%24initial_referrer%22%3A%20%22https%3A%2F%2Fwww.pion_created_at%22%3A%20%222015-08-03%22%2C%22platform%22%3A%20%22web%22%2C%%22%3A%20%%22%7D; t_session=BAh7DUkiD3Nlc3NpbWVfZV9uYW1lBjsARkkiH1BhY2lmaWMgVGltZSAoVVMgJiBDYW5hZGEpBjsAVEkiFXNpZ25pbl9wZXJzb25faWQGOwBGaQMSvRpJIhRsYXN0X2xvZ2luX2RhdGUGOwBGVTogQWN0aXZlU3VwcG9ydDo6VGltZVdpdGhab25lWwhJdToJVGltZQ2T3RzAAABA7QY6CXpvbmVJIghVVEMGOwBUSSIfUGFjaWZpZWRfZGFzaGJvYXJkX21lc3NhZ2UGOwBGVA%3D%3D--6ce6ef4bd6bc1a469164b6740e7571c754b31cca
Run Code Online (Sandbox Code Playgroud)
我想在Python请求请求中使用此cookie.(我略微修改了cookie,因此它不能被读者用于恶意目的!).
但是,请求似乎使用字典格式发送cookie,而我将上述字符串/ blob转换为字典格式时遇到问题.
我的问题是:
我正在尝试动态查找其结构事先未知的 JSON 对象的叶节点的名称。首先,我将字符串解析为 JToken 列表,如下所示:
string req = @"{'creationRequestId':'A',
'value':{
'amount':1.0,
'currencyCode':'USD'
}
}";
var tokens = JToken.Parse(req);
Run Code Online (Sandbox Code Playgroud)
然后我想确定哪些是叶子。在上面的例子中,'creationRequestId':'A','amount':1.0和'currencyCode':'USD'都是树叶和名称creationRequestId,amount以及currencyCode。
下面的示例递归遍历 JSON 树并打印叶子名称:
public static void PrintLeafNames(IEnumerable<JToken> tokens)
{
foreach (var token in tokens)
{
bool isLeaf = token.Children().Count() == 1 && !token.Children().First().Children().Any();
if (token.Type == JTokenType.Property && isLeaf)
{
Console.WriteLine(((JProperty)token).Name);
}
if (token.Children().Any())
PrintLeafNames(token.Children<JToken>());
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,打印:
creationRequestId
amount
currencyCode
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有一个不那么难看的表达式来确定 JToken 是否是叶子:
bool isLeaf = token.Children().Count() …Run Code Online (Sandbox Code Playgroud) 有许多很好的方法可以从JSON自动生成C#代码,例如此处和此处.
但是,生成的代码不包含属性初始值设定项.例如,以下JSON:
{
"Name" : "Blastoise"
}
Run Code Online (Sandbox Code Playgroud)
得到反序列化:
public class RootObject
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
大概这是设计的,因为JSON中使用的值可能会被覆盖,所以添加初始化器可能会让那些不想要它们的人烦恼.
但如果我想要怎么办?如果没有手动手动添加每个值,有没有办法将JSON反序列化为以下内容?
public class RootObject
{
public string Name { get; set; } = "Blastoise";
}
Run Code Online (Sandbox Code Playgroud)
显然,在这种情况下,手动编辑很容易,但对于较大的JSON对象,手动编辑变得乏味.