Erreur lors de la désérialisation JSON pour Objet
J'ai besoin de convertir les données JSON que je l'obtenir à partir d'une API REST et de les convertir au format CSV pour certains analytique. Le problème est que les données JSON ne suivent pas nécessairement le même contenu, donc je ne peux pas définir un type de cartographie. C'est devenu un défi qui prend trop de mon temps. J'ai déjà créé un peu de code, mais ça ne fonctionne pas comme il le jette exception sur cette ligne
var data = JsonConvert.DeserializeObject<List<object>>(jsonData);
L'erreur est:
Informations supplémentaires: Ne peut pas désérialiser l'actuel objet JSON
(par exemple, {"name":"valeur"}) dans le type
'Système.Les Collections.Génériques.Liste`1[Système.Objet] " parce que le type de
nécessite un tableau JSON (par exemple, [1,2,3]) pour désérialiser correctement.Pour corriger cette erreur soit modifier le JSON d'un tableau JSON (par exemple, [1,2,3]) ou de modifier le désérialisé type de sorte qu'il est normal .NET type (par exemple, pas un type primitif comme entier, pas un type de collection comme un tableau ou une Liste) qui peut être désérialisé à partir d'un objet JSON. JsonObjectAttribute peuvent également être ajoutés à la type pour le forcer à désérialiser à partir d'un objet JSON.
Chemin de 'données', à la ligne 2, la position de 10.
s'il vous plaît laissez-moi savoir ce que je peux faire pour obtenir ce que ça va.
Un échantillon de données serait comme ça, les champs de données peuvent changer très souvent, par exemple, un champ peut être ajouté à la prochaine journée, donc je n'ai pas la liberté de créer un .Net de classe à mapper les données.
{
"data": [
{
"ID": "5367ab140026875f70677ab277501bfa",
"name": "Happiness Initiatives - Flow of Communication/Process & Efficiency",
"objCode": "PROJ",
"percentComplete": 100.0,
"plannedCompletionDate": "2014-08-22T17:00:00:000-0400",
"plannedStartDate": "2014-05-05T09:00:00:000-0400",
"priority": 1,
"projectedCompletionDate": "2014-12-05T08:10:21:555-0500",
"status": "CPL"
},
{
"ID": "555f452900c8b845238716dd033cf71b",
"name": "UX Personalization Think Tank and Product Strategy",
"objCode": "PROJ",
"percentComplete": 0.0,
"plannedCompletionDate": "2015-12-01T09:00:00:000-0500",
"plannedStartDate": "2015-05-22T09:00:00:000-0400",
"priority": 1,
"projectedCompletionDate": "2016-01-04T09:00:00:000-0500",
"status": "APR"
},
{
"ID": "528b92020051ab208aef09a4740b1fe9",
"name": "SCL Health System - full Sitecore implementation (Task groups with SOW totals in Planned hours - do not bill time here)",
"objCode": "PROJ",
"percentComplete": 100.0,
"plannedCompletionDate": "2016-04-08T17:00:00:000-0400",
"plannedStartDate": "2013-11-04T09:00:00:000-0500",
"priority": 1,
"projectedCompletionDate": "2013-12-12T22:30:00:000-0500",
"status": "CPL"
}
]
}
namespace BusinessLogic
{
public class JsonToCsv
{
public string ToCsv(string jsonData, string datasetName)
{
var data = JsonConvert.DeserializeObject<List<object>>(jsonData);
DataTable table = ToDataTable(data);
StringBuilder result = new StringBuilder();
for (int i = 0; i < table.Columns.Count; i++)
{
result.Append(table.Columns[i].ColumnName);
result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
result.Append(row[i].ToString());
result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
}
}
return result.ToString().TrimEnd(new char[] {'\r', '\n'});
}
private DataTable ToDataTable<T>( IList<T> data )
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for (int i = 0 ; i < props.Count ; i++)
{
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T item in data)
{
for (int i = 0 ; i < values.Length ; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
return table;
}
}
}
J'ai mis à jour la question auprès d'un échantillon de données.
J'obtiens la même erreur à nouveau.
L'exemple JSON que vous avez posté n'est pas corrélée à un seul objet dans votre erreur à la place du tableau, vous êtes en train de jeter.
OriginalL'auteur Payam | 2015-12-18
Vous devez vous connecter pour publier un commentaire.
Le vrai problème ici est que vous essayez de désérialiser dans un
List<object>
mais votre JSON représente, en réalité, un seul objet contenant unedata
de la propriété qui contient une liste d'objets. C'est pourquoi vous obtenez cette erreur. Json.Net ne peut pas désérialiser un objet unique dans une liste. Je pense vraiment ce que vous voulez faire est de définir une classe de conteneur comme ceci:Puis désérialiser comme ceci:
Vous serez alors fin avec une liste de dictionnaires, où chaque dictionnaire représente un élément dans le tableau JSON. Le dictionnaire de paires clé-valeur sont les valeurs dynamiques dans chaque élément. Vous pouvez ensuite travailler avec ces comme vous le feriez avec n'importe quel autre dictionnaire. Par exemple, voici comment vous devez vider toutes les données:
Violon: https://dotnetfiddle.net/6UaKhJ
Heureux que j'ai été capable de les aider.
OriginalL'auteur Brian Rogers
Si vos données est dynamique donc, essayez une liste dynamique:
OriginalL'auteur Rodolfo
Ce que vous cherchez est la
dynamic
type. Si non, cette réponse contient beaucoup de renseignements sur la façon dont vous serez en mesure de parcourir l'évolution des propriétés de votre objet.Vous aurez besoin d'ajouter un peu plus de travail pour comprendre comment gérer votre résultat quand c'est un tableau plutôt qu'un seul objet en tant que votre erreur nous montre. Cependant, c'est une bonne première étape pour vous.
Fondamentalement, un
dynamic
objet est un Dictionnaire, un peu comme la façon dont un objet JSON est traitée dans le code JavaScript. Vous avez juste besoin de parcourir chacun des KeyValuePair objets à l'intérieur de l'objet principal et allez par le biais de leurs propriétés.C'est loin d'être un exemple complet, mais nous n'avons pas assez d'informations pour vous aider à terminer ce que vous essayez de faire.
OriginalL'auteur krillgar
Essayez d'utiliser cette classe à la place de l'Objet
Changement:
Je vois. Ok. Que penser de l'utilisation de la Liste<Dynamique> ?
OriginalL'auteur Jared
Puisque vous essayez de désérialiser un objet de type dans un type de liste, il ne sera pas deseralize directement.
Vous pouvez faire ceci:
Voici de nouvelles classes
OriginalL'auteur joordan831
Aussi loin que je peux dire, des versions plus récentes de Newtonsoft est possible de faire ça maintenant, pas de travail supplémentaire.
J'ai travaillé avec la version binaire cependant, et ce qui ne l'ont encore la question - j'ai eu un test où vous pouvez configurer pour utiliser les binaires ou json, et la version json a très bien fonctionné, mais le binaire plaint de ne pas obtenir de type tableau.
J'ai commencé à utiliser le BsonDataReader pour cela, et était à la recherche à travers les propriétés et méthodes sur elle pour voir comment je pourrais mieux voir le contenu, et lo et voici, il avait une propriété appelée:
Mettre ce paramètre à 'true' a fait le tour.
OriginalL'auteur Arwin