C#JSON对象查询

时间:2014-03-13 14:30:13

标签: c# json

我在搜索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();
            }
        }  
    }        
}
}

有人可以帮忙吗?我甚至不确定是否可以直接查询,或者我是否需要将其放入字典或什么内容?

2 个答案:

答案 0 :(得分:0)

对于第一部分,将表反序列化为嵌套字典,如下所示:

Dictionary<string, Dictionary<string, int>> table =
    JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, int>>>(data);

然后,创建一个帮助方法,可以检查表中是否存在给定的DxccBand对:

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,提取DxccBand值,并调用帮助方法:< / 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回答更好的解决方案吗? 感谢