如何解决无法反序列化与键“ 1”,“ 2”混淆的JSON

时间:2019-10-04 09:00:32

标签: c# json.net

我对编号(关键)新闻列表(数组)感到困惑

json字符串有效,在nodeJS中它设法输出了我需要的值。

JSON STRING

{
  "newsalert": [{
    "newslist": {
      "1": {
        "newsid": "4321",
        "headline": "Great White Shark Found",
        "newscode": "GWS",
        "newstime": "10:04:32"
      },
      "2": {
        "newsid": "8031",
        "headline": "Polar Bear Escaped",
        "newscode": "PBE",
        "newstime": "09:28:03"
      }
    }
  }]
}

C#代码

class MainNews {
    public Dictionary<string, newslist[]> newsalert { get; set; }
}

class newslist {
    public int newsid { get; set; }
    public string headline{ get; set; }
    public string newscode { get; set; }
    public string newstime { get; set; }
}

static void ShowObject(MainNews obj) {
    foreach (var item in obj.news.Values.ElementAt(0)) {
        MessageBox.Show(item.headline);
    }
}

private void BtnTest_Click(object sender, RoutedEventArgs e) {
    JavaScriptSerializer json_serializer = new JavaScriptSerializer();
    var xnews = JsonConvert.DeserializeObject<MainNews>(jsonstring);
    ShowObject(xnews);
}

错误

  

Newtonsoft.Json.JsonSerializationException:'无法反序列化   当前的JSON数组,因为该类型需要JSON对象

1 个答案:

答案 0 :(得分:3)

您的词根和字典之间缺少一个步骤。
newsalert是对象上属性名称为newslist的集合。
那是你的字典。

public class MainNews
{
    public List<NewAlert> newsalert { get; set; }
}

public class NewAlert
{
    public Dictionary<int, NewItem> newslist { get; set; }
}

public class NewItem
{
    public string newsid { get; set; }
    public string headline { get; set; }
    public string newscode { get; set; }
    public string newstime { get; set; }
}

您可以简单地:

string input = @"{
  ""newsalert"": [{
    ""newslist"": {
      ""1"": {
        ""newsid"": ""4321"",
        ""headline"": ""Great White Shark Found"",
        ""newscode"": ""GWS"",
        ""newstime"": ""10:04:32""
      },
      ""2"": {
        ""newsid"": ""8031"",
        ""headline"": ""Polar Bear Escaped"",
        ""newscode"": ""PBE"",
        ""newstime"": ""09:28:03""
      }
    }
  }]
}";


var result =  JsonConvert.DeserializeObject<MainNews>(input);       
result.newsalert.SelectMany(x=> x.newslist.Values).Dump();

实时演示:https://dotnetfiddle.net/Ar5ocP