2016-09-09 1 views
0
[{"id":"PROCESS_ROOT_NODE","text":"TEMPLATE - 3333(2)","icon":"fa fa-list fa-color-graylt","li_attr":{"id":"PROCESS_ROOT_NODE","__type":"li_attr:#SomeNamespace.JsonDataContractClasses","class":" ps_node_li "}}] 

J'ai réduit l'objet en bas. Fondamentalement, lorsque le «__type» n'est pas dans la première position, avant «id». La désérialisation va lancer une erreur.Comment faire en sorte que la clé __type dans json soit la première pour DataContractJsonSerializer

J'ai tout le contenu de DataContract configuré correctement, avec des types connus. J'ai testé dans une application de console, en sérialisant, puis en reprenant cette chaîne à travers la désérialisation et cela fonctionne parfaitement. La seule différence est l'emplacement du '__type'. Ceci est un problème MS connu. Documenté à https://msdn.microsoft.com/en-us/library/bb412170(v=vs.110).aspx

Essayé un remplacement de chaîne, qui fonctionne. et le DataContractJsonSerializer ne se souciait pas si la clé '__type' était là deux fois. Nous cherchons simplement le meilleur moyen de déplacer le __type à la première position.

Répondre

0

Outre le remplacement de la chaîne. J'ai utilisé une réponse de Dave R - stack overflow

Utilisez la méthode de remplacement JSON.stringify (obj, tableau de remplacement).

var json = JSON.stringify(o, ['__type', 'id', 'parent', 'text', 'type', 'children', 'data', 'li_attr', 'a_attr', 'state', 'class', 'descr', 'display_priority', 'action_area_id', 'action_user_type_id']); 

Son un peu d'une douleur à la liste toutes les clés, mais il agit également comme un filtre, donc je reviens seulement ce que je dois aussi bien. Et depuis que j'ai mis '__type' en premier, dans tous les objets et sous-objets, cette clé a été listée en premier après le stringify.

1

Vous pouvez utiliser Json.Net pour manipuler votre JSON

var jArr = JArray.Parse(jsonstring); 
var attrs = jArr.Select(x => x["li_attr"]).ToList(); 
attrs.ForEach(attr => 
{ 
    var type = attr["__type"].Parent; 
    type.Remove(); 
    (attr as JObject).AddFirst(type); 
}); 
var newjson = jArr.ToString(Newtonsoft.Json.Formatting.Indented); 

sortie de ce code est

[ 
    { 
    "id": "PROCESS_ROOT_NODE", 
    "text": "TEMPLATE - 3333(2)", 
    "icon": "fa fa-list fa-color-graylt", 
    "li_attr": { 
     "__type": "li_attr:#SomeNamespace.JsonDataContractClasses", 
     "id": "PROCESS_ROOT_NODE", 
     "class": " ps_node_li " 
    } 
    } 
] 

Mais je recommande d'utiliser Json.Net tout le chemin au lieu de simplement convertir votre JSON le format désiré.

+0

Ceci est une bonne solution, et d'autres devraient l'essayer en premier, si vous avez accès à la nouvelle version de json.net. Malheureusement, nous avons un ancien code qui repose sur la version 2.0, et le changement entraînerait des tests majeurs. –

+0

Par expérience, j'ai trouvé que le JSON doit être reserialized avec 'Newtonsoft.Json.Formatting.None'. Même si vous avez un espace entre le '{' et le '' __type "', DataContractJsonSerializer' échouera à traiter l'indication de type. – dbc