2014-03-13 87 views
1

我在搜索JSON对象时有点困难,主要是因为一个相对较新的程序员。 我需要做的第一件事就是取回它具有以下格式的JSON表:C#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”的datavalue: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(); 
      } 
     } 
    }   
} 
} 

有人可以请大家帮帮忙吗?我甚至不确定是否可以直接查询,或者如果我需要把它放在字典或什么?

+3

我很难理解问题的要求。我看到你将数据解析成一个JObject,但是你之后对数据不做任何处理。你能否澄清这些要求并给出一个更精确的问题? 与此同时http://james.newtonking.com/json/help/index.html?topic=html/QueryingLINQtoJSON.htm可能是你想要的。 –

+0

你可以看到:http://www.clublog.org:7373/ – Thomas

+0

你在这里有什么问题?什么都行不通,你有例外,意外的结果吗? – Thomas

回答

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值,并调用的H elper方法:

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 
    } 
+0

嗨布莱恩。事实证明,我读了上面的参考文献并尝试了一些东西。本质上,我找到了一个简单的解决方案,但我不明白它为什么起作用。我也会使用你的回复的第二部分。 – Tom

+0

除了将查询表反序列化到一个'JObject'而不是一个字典之外,你的方式基本上是一样的。 'JObject'的行为就像一本字典,所以你可以用同样的方式查询它的键值。如果你的代码有效,请坚持下去。 –

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是否回答了更好的解决方案? 谢谢