C# разбор нескольких json - PullRequest
0 голосов
/ 28 марта 2020

Данные JSON выглядят следующим образом:

{"Sucess":true,
"Code":0,
"Msg":"Sucess",
"Data":{
        "UserDayRanking":
        {
        "UserID":11452112,
        "UserCharm":0,
        "UserName":"gay",
        "UserGender":1,
        "UserLevel":36,
        "UserPhoto":"http://res.xxx.com/2020/3/16/63719926625601201487545U11452112.jpeg",
        "Ranking":0,
        "IsNobility":0,
        "NobilityType":0,
        "NobilityLevel":0,
        "UserShowStyle":null,
        "LiveLevelUrl":null,
        "IsStealth":false},
        "DayRankingList":[
                        {
                        "UserID":3974854,
                        "UserCharm":114858,
                        "UserName":"jack",
                        "UserGender":1,
                        "UserLevel":91,
                        "UserPhoto":"http://res.xxx.com/2020/2/15/63717400601924412312384U3974854.jpeg",
                        "Ranking":2,
                        "IsNobility":1,
                        "NobilityType":1,
                        "NobilityLevel":3,
                        "UserShowStyle":
                        {
                                        "NameColor":100102,
                                        "BorderColor":100403,
                                        "LiangMedal":0,
                                        "DztCountDown":0,
                                        "Mounts":100204,
                                        "LiveLevelCode":0,
                                        "LiveRights":null
                                        },
                                        "LiveLevelUrl":null,
                                        "IsStealth":false
                        },
                        {"UserID":6231512,
                        "UserCharm":22644,
                        "UserName":"red.girl",
                        "UserGender":1,
                        "UserLevel":57,
                        "UserPhoto":"http://res.xxx.com/2019/11/20/63709843050801519858823U6231512.jpeg",
                        "Ranking":3,
                        "IsNobility":0,
                        "NobilityType":0,
                        "NobilityLevel":0,
                        "UserShowStyle":{
                                        "NameColor":0,
                                        "BorderColor":0,
                                        "LiangMedal":0,
                                        "DztCountDown":0,
                                        "Mounts":0,
                                        "LiveLevelCode":0,
                                        "LiveRights":null
                                        },
                                        "LiveLevelUrl":null,
                                        "IsStealth":false}
                        ],
                        "LiveCharmSwitch":1,
                        "IsSelf":false
        }
}

Я хочу использовать c # извлечение

"UserID": 3974854,
"UserCharm": 114858,
"UserName": "jack",

"UserID":6231512,
"UserCharm":22644,
"UserName":"red.girl",

То есть для извлечения UserID, UserCharm, UserName , This json имеет много слоев, что я хочу после извлечения: id сортируется в порядке

id = 1, UserID = 3974854, UserCharm = 114858, UserName = jack
id = 2, UserID = 6231512, UserCharm = 22644, UserName = red.girl

Я использую следующий код, но извлекаю только первый

string json = @"{"Sucess":true,"Code":0,"Msg":"Sucess","Data":{"UserDayRanking":{"UserID":11452112,"UserCharm":0,"UserName":"gay","UserGender":1,"UserLevel":36,"UserPhoto":"http://res.xxx.com/2020/3/16/63719926625601201487545U11452112.jpeg","Ranking":0,"IsNobility":0,"NobilityType":0,"NobilityLevel":0,"UserShowStyle":null,"LiveLevelUrl":null,"IsStealth":false},"DayRankingList":[{"UserID":3974854,"UserCharm":114858,"UserName":"jack","UserGender":1,"UserLevel":91,"UserPhoto":"http://res.xxx.com/2020/2/15/63717400601924412312384U3974854.jpeg","Ranking":2,"IsNobility":1,"NobilityType":1,"NobilityLevel":3,"UserShowStyle":{"NameColor":100102,"BorderColor":100403,"LiangMedal":0,"DztCountDown":0,"Mounts":100204,"LiveLevelCode":0,"LiveRights":null},"LiveLevelUrl":null,"IsStealth":false},{"UserID":6231512,"UserCharm":22644,"UserName":"red.girl","UserGender":1,"UserLevel":57,"UserPhoto":"http://res.xxx.com/2019/11/20/63709843050801519858823U6231512.jpeg","Ranking":3,"IsNobility":0,"NobilityType":0,"NobilityLevel":0,"UserShowStyle":{"NameColor":0,"BorderColor":0,"LiangMedal":0,"DztCountDown":0,"Mounts":0,"LiveLevelCode":0,"LiveRights":null},"LiveLevelUrl":null,"IsStealth":false}],"LiveCharmSwitch":1,"IsSelf":false}}";
List<Info> jobInfoList = JsonConvert.DeserializeObject<List<Info>>(z);

            foreach (Info jobInfo in jobInfoList)
            {
                //Console.WriteLine("UserName:" + jobInfo.UserName);
            }
public class Info
        {
            public string UserCharm { get; set; }
            public string UserName { get; set; }
            public data DayRankingList { get; set; }
        }

        public class data
        {
            public int UserID { get; set; }
            public string UserCharm { get; set; }
            public string UserName { get; set; }
            public string UserGender { get; set; }
            public string UserLevel { get; set; }
        }

Приведенный выше код показывает только имя пользователя = jack , Никогда не показывать имя пользователя = red.girl

Ответы [ 3 ]

2 голосов
/ 28 марта 2020

Как мне кажется, вам нужны детали из вашего JSON, который находится в DayRankingList. Поскольку вам нужны только некоторые данные, мы можем использовать инструмент типа http://json2csharp.com/, чтобы создать наши классы, а затем удалить то, что нам не нужно. Затем мы получим следующие классы:

 public class DayRankingList
 {
     public int UserID { get; set; }
     public int UserCharm { get; set; }
     public string UserName { get; set; }         
 }

 public class Data
 {
     public List<DayRankingList> DayRankingList { get; set; }
 }

 public class RootObject
 {
     public Data Data { get; set; }
 }

, которые вы можете десериализовать следующим образом

string json = .....
var root = JsonConvert.DeserializeObject<RootObject>(json);

Затем, если вы будете sh, вы можете извлечь внутренние данные в новый Список <>, а затем просто работать над этим.

    List<DayRankingList> rankingLists = root.Data.DayRankingList;
    //Do something with this, such as output it
    foreach(DayRankingList drl in rankingLists)
    {
        Console.WriteLine(String.Format("UserId {0} UserCharm {1} UserName {2}",drl.UserId, drl.UserCharm, drl.UserName));
    }
1 голос
/ 28 марта 2020

Вы можете использовать Json.Linq для анализа JSON в JObject и перечисления DayRankingList элементов (так как это массив). Затем преобразуйте каждый элемент в класс data и упорядочите результирующую последовательность по UserID

var jObject = JObject.Parse(json);
var rankingList = (jObject["Data"] as JObject)?.Property("DayRankingList");

var list = rankingList.Value
    .Select(rank => rank.ToObject<data>())
    .OrderBy(item => item?.UserID);

foreach (var user in list) 
    Console.WriteLine($"{user.UserID} {user.UserName}");

Другой способ - скопировать ваш JSON, go в Правка-> Вставить специальный-> Вставьте JSON как классы в меню Visual Studio и сгенерируйте правильную иерархию классов (у меня есть 5 классов, они довольно длинные для публикации здесь), затем используйте их во время десериализации

0 голосов
/ 28 марта 2020

Самый безопасный для типов способ - это определить требуемую структуру класса, как предложил jason.kaisersmith.

Однако, чтобы получить конечный формат, который вам нужен, вы можете выполнить дополнительный Linq-ордер и выберите, чтобы включить идентификатор:

var finalList = rankingLists.OrderBy(rl => rl.UserId).Select((value, index) => new
{
    id = index,
    value.UserId,
    value.UserCharm,
    value.UserName
});

foreach (var drl in finalList)
{
    Console.WriteLine($"Id = {drl.id}, UserId = {drl.UserId}, UserCharm = {drl.UserCharm}, UserName = {drl.UserName}");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...