我在搜索JSON对象时遇到了一些困难,主要是因为一个相对较新的程序员。 我需要做的第一件事就是检索一个具有以下格式的JSON表:
{
"1": {
"10": 1,
"15": 1,
"17": 1,
"20": 1,
"40": 2
},
"7": {
"20": 2
},
"12": {
"40": 2
},
"14": {
"17": 2
},
"15": {
"10": 2,
"15": 1,
"17": 2,
"20": 3
}
}
这里我们有两条记录(实际上会有300到400条记录)。我把它放在一个JSON对象中。
接下来,我使用以下格式以伪实时方式接收JSON记录:
{
"Call": "VR2XMT",
"Spotter": "UA4HTT",
"Comment": "strong",
"Freq": 28497,
"Band": 10,
"Dxcc": 321,
"Date": "2014-03-13T13:40:50.484133322Z"
}
如果查看表格,“1”或“7”表示记录中“Dxcc”:321的数据值。 “Band”表示表中的嵌套键。 我的查询需要做的是查看表中是否存在“Dxcc”以及该记录是否存在“Band”。 我不知道如何做到这一点。我试着转换成字典,但这不起作用。 这是迄今为止的基本代码:
class Program
{
static void Main(string[] args)
{
using (WebClient client = new WebClient())
{
var data = client.DownloadString("url");
JObject o;
o = JObject.Parse(data);
}
using (var context = ZmqContext.Create())
{
using (var socket = context.CreateSocket(SocketType.SUB))
{
socket.SubscribeAll();
socket.Connect("tcp://clublog.org:7373");
while (true)
{
Thread.Sleep(100);
var replyMsg = socket.Receive(Encoding.UTF8);
Console.WriteLine(replyMsg);
}
socket.UnsubscribeAll();
socket.Close();
}
}
}
}
}
有人可以帮忙吗?我甚至不确定是否可以直接查询,或者我是否需要将其放入字典或什么内容?
答案 0 :(得分:0)
对于第一部分,将表反序列化为嵌套字典,如下所示:
Dictionary<string, Dictionary<string, int>> table =
JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, int>>>(data);
然后,创建一个帮助方法,可以检查表中是否存在给定的Dxcc
和Band
对:
static bool Exists(Dictionary<string, Dictionary<string, int>> dict, string dxcc, string band)
{
Dictionary<string, int> inner;
return (dict.TryGetValue(dxcc, out inner) && inner.ContainsKey(band));
}
稍后,当您在循环中收到消息时,可以将每个消息反序列化为JObject
,提取Dxcc
和Band
值,并调用帮助方法:< / p>
JObject jo = JObject.Parse(replyMsg);
string dxcc = jo["Dxcc"].ToString();
string band = jo["Band"].ToString();
if (!Exists(table, dxcc, band))
{
// doesn't exist, so do something with the replyMsg
}
答案 1 :(得分:0)
事实证明,我使用上面的链接做了这个:
while (true)
{
string msgDXCC;
string band;
Thread.Sleep(100);
var spot = socket.Receive(Encoding.UTF8);
if (spot != "")
{
spotMsg = JObject.Parse(spot);
msgDXCC = (string)spotMsg["Dxcc"];
band = (string)spotMsg["Band"];
var keyPresent = o.Property(msgDXCC);
if (keyPresent != null)
{
string qsoStatus = (string)o[msgDXCC][band];
if (qsoStatus == null)
{
//add record
}
else
{
//do nothing
}
}
}
}
它现在正如预期的那样工作。 但是,Brians回答更好的解决方案吗? 感谢