Ayez une liste qui retourne en Json mais souhaitez la formater comme ci-dessous. Je ne peux pas comprendre pour la vie de moi pourquoi je n'arrive pas à le mettre en forme correctement.

[{
    "AppFormName": "TFB Test Application",
    "Questions": [{
        "QuestionName": "How old are you?",
        "QuestionType": 1
    },
    {
        "QuestionName": "Where are you from?",
        "QuestionType": 1
    }]
},
{
    "AppFormName": "HLL",
    "Questions": [{
        "QuestionName": "How old are you?",
        "QuestionType": 1
    },
    {
        "QuestionName": "Where are you from?",
        "QuestionType": 1
    },
    {
        "QuestionName": "What Game are you applying for?",
        "QuestionType": 2
    },
    {
        "QuestionName": "Do you agree to the clan rules",
        "QuestionType": 3
    }]
}]

C'est ce que mon code produit actuellement:

[
    {
        "AppFormName": "TFB Test Application",
        "QuestionName": "How old are you?",
        "QuestionType": 1
    },
    {
        "AppFormName": "TFB Test Application",
        "QuestionName": "Where are you from?",
        "QuestionType": 1
    },
    {
        "AppFormName": "HLL",
        "QuestionName": "How old are you?",
        "QuestionType": 1
    },
    {
        "AppFormName": "HLL",
        "QuestionName": "Where are you from?",
        "QuestionType": 1
    },
    {
        "AppFormName": "HLL",
        "QuestionName": "What Game are you applying for?",
        "QuestionType": 2
    },
    {
        "AppFormName": "HLL",
        "QuestionName": "Do you agree to the clan rules",
        "QuestionType": 3
    }
]

C'est mon contrôleur où j'essaye de sérialiser les résultats;

public ActionResult AccessToken(string authorizationCode)
{
    UserFunctions.AccessToken(authorizationCode);
    var results = UserFunctions.userApplications;

    return Json(results , JsonRequestBehavior.AllowGet);
}

Modèle:

public class UserApplications
{
    public string AppFormName { get; set; }
    public string QuestionName { get; set; }
    public int QuestionType { get; set; }
}

Fonction pour obtenir des données;

   public static List<Models.UserApplications> GetUserApplications(string ClientId)
    {
        userApplications.Clear();

        var getUserApplications = getUserApplicationsSQL;

        using (var conn = new MySqlConnection(dataConn))
        {
            using (var cmd = new MySqlCommand(getUserApplications, conn))
            {
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@DiscordClientID", ClientId);
                cmd.Connection.Open();
                using (var dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    while (dr.Read())
                    {
                        var u = new Models.UserApplications
                        {
                            AppFormName = dr["AppFormName"].ToString(),
                            QuestionName = dr["QuestionName"].ToString(),
                            QuestionType = dr.GetInt32(dr.GetOrdinal("TypeID")),
                        };
                        userApplications.Add(u);
                    }
                }
            }
        }

        return userApplications;
    }
1
WHoward 28 oct. 2020 à 14:06

3 réponses

Meilleure réponse

Vous avez besoin de code à traduire de votre structure de données existante en une structure qui produira la structure JSON souhaitée. Cela peut être accompli relativement facilement en utilisant Linq. Et puis vous devez retourner cette liste dans votre méthode d'action:

public ActionResult AccessToken(string authorizationCode)
{
    UserFunctions.AccessToken(authorizationCode);
    var results = UserFunctions.userApplications;

    var appFormList = results.GroupBy(s => s.AppFormName).Select(g => new
    {
      AppFormName = g.Key, Questions = g.Select(a => new
      {
        a.QuestionName, 
        a.QuestionType
      })
    });

    return Json(appFormList, JsonRequestBehavior.AllowGet);
}

Démo en direct: https://dotnetfiddle.net/sRIy72

(Crédit à ce post pour l'idée à utiliser Linq.)

1
ADyson 28 oct. 2020 à 13:51

Voici comment j'utilise json

Mon modele

public class Questions {
    public string QuestionName { get; set; } 
    public string QuestionType { get; set; } 
}

public class App {
    public string AppFormName { get; set; } 
    public Questions Questions { get; set; } 
}

Manette

App DeserializedClass = JsonConvert.DeserializeObject<App>(myJsonResponse);

J'espère avoir aidé

-1
M.gharzi 28 oct. 2020 à 12:11

Ceci peut être simplement réalisé en regroupant:

public ActionResult AccessToken(string authorizationCode)
{
    UserFunctions.AccessToken(authorizationCode);
    List<UserApplications> results = UserFunctions.userApplications;
    var data = from p in results 
           group p by p.AppFormName into g
           select new { AppFormName = g.Key, Questions = g.Select(x=> new { QuestionName = x.QuestionName, QuestionType = x.QuestionType}).ToList() };

    return Json(data , JsonRequestBehavior.AllowGet);
}
1
Rehan Khan 28 oct. 2020 à 13:40