How to parse a json array json.net

社会主义新天地 提交于 2019-12-14 03:36:52

问题


I know it sounds basic but all answers around this question have been stupidly large and bulky code that does not allow the functionality i need. i need to parse this json array.

[
   {
      "label":"Cow (1)",
      "value":3309
   },
   {
      "label":"Cow (1)",
      "value":14998
   },
   {
      "label":"Cow (4)",
      "value":20969
   },
   {
      "label":"Cow (4)",
      "value":20970
   },
   {
      "label":"Cow (4)",
      "value":20971
   },
   {
      "label":"Cowardly Bandit",
      "value":1886
   },
   {
      "label":"Cow calf (1)",
      "value":2310
   },
   {
      "label":"Coward in armour (82)",
      "value":5097
   },
   {
      "label":"Coward with bow (105)",
      "value":6049
   },
   {
      "label":"Cow calf (1)",
      "value":20979
   },
   {
      "label":"Undead cow (4)",
      "value":1691
   },
   {
      "label":"Plague cow",
      "value":1998
   },
   {
      "label":"Plague cow",
      "value":1999
   },
   {
      "label":"Unicow (57)",
      "value":5603
   },
   {
      "label":"Zombie cow (1)",
      "value":18597
   },
   {
      "label":"Zombie cow (1)",
      "value":20928
   },
   {
      "label":"Super Cow (5)",
      "value":21497
   },
   {
      "label":"Dairy cow",
      "value":22418
   },
   {
      "label":"Armoured cow thing (62)",
      "value":5986
   },
   {
      "label":"Armoured cow thing (62)",
      "value":6048
   }
]

And when i try to access the data point inside the array it returns null, code:

Stream stream = client.OpenRead("http://services.runescape.com/m=itemdb_rs/bestiary/beastSearch.json?term=" + Input);
StreamReader reader = new StreamReader(stream);
jObject = JObject.Parse(reader.ReadToEnd());
stream.Close();
//put items into list view
// i is the number where the json object is in the array 
var lvi = new ListViewItem(new string[] { (string)jObject[i]["label"], (string)jObject[i]["value"] }); 

I do not want to use classes


回答1:


Not wanting to use classes is weird but not impossible.

var json = reader.ReadToEnd();
var objects = JsonConvert.DeserializeObject<dynamic[]>(json);
var lvi = new ListViewItem(new string[] { (string)objects[i].label, (string)objects[i].value }); 



回答2:


Found error in your code. Instead:

JObject.Parse(reader.ReadToEnd());

Write (JObject -> JArray):

string text = reader.ReadToEnd();
var jObject = JArray.Parse(text);

Also when write operation in 2 lines, you will see where the error: in reading from the stream or in serialization.




回答3:


Try my answer to this question :

public IEnumerable<MeItem> DeserializeListFromJson(string jsonArray)
{
    return JsonConverter.DeserializeObject<List<JObject>>(jsonArray).Select( obj => DeserializeFromJson(obj) );
}

public MeItem DeserializeFromJson(string jsonString)
{
    return JsonConvert.DeserializeObject<MeItem>(jsonString);
}

You can find necessary detailed informations in my answer for this question and this one

Edit:

If you do not want to use classes then you can just modify DeserializeFromJson() method into something like this :

public KeyValuePair<string, string> DeserializeFromJson(JObject obj)
{
    return new KeyValuePair<string, string>(obj.SelectToken("label").Value<string>(), obj.SelectToken("value").Value<string>());
}

Which will require to modify DeserializeListFromJson() method into :

public IEnumerable<KeyValuePair<string,string>> DeserializeListFromJson(string jsonArray)
{
    return JsonConverter.DeserializeObject<List<JObject>>(jsonArray).Select( obj => DeserializeFromJson(obj) );
}

Usage with your case :

Stream stream = client.OpenRead("http://services.runescape.com/m=itemdb_rs/bestiary/beastSearch.json?term=" + Input);
ListViewItem item = null;
using (StreamReader reader = new StreamReader(stream))
{
    KeyValuePair<string, string> selected = DeserializeListFromJson(reader.ReadToEnd()).ElementAt(i);
    item = new ListViewItem(new string[] { selected.Key, selected.Value });
}


来源:https://stackoverflow.com/questions/41612215/how-to-parse-a-json-array-json-net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!