Как исправить, нельзя десериализовать JSON, перепутал с ключами "1", "2" - PullRequest
1 голос
/ 04 октября 2019

Я путаюсь с нумерованным (ключевым) списком новостей (массивом)

Строка 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 Ответ

3 голосов
/ 04 октября 2019

Вам не хватает шага между вашим корнем и словарем.
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...