【问题标题】:How to parse a json array json.net如何解析 json 数组 json.net
【发布时间】:2017-01-12 11:35:41
【问题描述】:

我知道这听起来很基本,但围绕这个问题的所有答案都是愚蠢的大而笨重的代码,不允许我需要的功能。我需要解析这个 json 数组。

[
   {
      "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
   }
]

当我尝试访问数组内的数据点时,它返回 null,代码:

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 那么你做出了一个奇怪的决定,选择使用面向对象的语言。
  • 将其转换为动态列表并访问您想要的详细信息
  • 确定您从该网络服务获得了正确的数据吗?也许将 reader.ReadToEnd() 读入一个字符串变量,您可以检查它,尝试解析它之前。

标签: c# .net json.net


【解决方案1】:

在您的代码中发现错误。而是:

JObject.Parse(reader.ReadToEnd());

写入(JObject -> JArray):

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

另外,在两行写入操作时,您会看到错误在哪里:从流中读取或在序列化中。

【讨论】:

    【解决方案2】:

    不想使用类很奇怪,但并非不可能。

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

    【讨论】:

    • Thankyou.. 避免上课的原因是因为它有一定数量的变量,其中需要接收的辅助 json 在所述 json 中有超过 100 个变量。为此创建一个类将是充其量是荒谬的
    • @Offnix 你显示的 JSON 是一个对象数组,每个对象都有相同的 labelvalue 字段。假设您所指的另一个 JSON 共享相同的模式,您只需创建一个具有这两个属性的类并将 JSON 解析为该类的数组。
    • @Offnix,Json.Net 允许动态,只需确保您调用的属性实际存在于 json 中,否则您将收到动态运行时错误。否则,只需使用您要使用的属性创建一个类,它只会用这些属性填充类并忽略其余部分
    【解决方案3】:

    试试我对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);
    }
    

    您可以在我对this questionthis one的回答中找到必要的详细信息

    编辑:

    如果您不想使用类,那么您可以将DeserializeFromJson() 方法修改为如下内容:

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

    需要将DeserializeListFromJson()方法修改为:

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

    与您的案例一起使用:

    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 });
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多