2016-09-09 17 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 "}}] 

私はオブジェクトを小さくスリム化しました。 基本的に '__type'が 'id'の前の最初の位置にないとき。デシリアライズするとエラーが発生します。DataContractJsonSerializerのjsonで__typeキーを最初に取得する方法

既知のタイプのすべてのDataContract stuff設定が正しくあります。 私は、コンソールアプリケーションでシリアル化してから、その文字列をdeserializeに戻してテストしたところ、完全に動作します。唯一の違いは、 '__type'の場所です。これは既知のMSの問題です。 文書番号:https://msdn.microsoft.com/en-us/library/bb412170(v=vs.110).aspx

文字列置換を試行します。 DataContractJsonSerializerは '__type'キーが2回あると気にしませんでした。

content = content.Replace("\"li_attr\":{", "\"li_attr\":{\"__type\":\"li_attr:#Payce.Common.AnonymousClasses.JsonDataContractClasses\","); 

__typeを最初の位置に移動する最適な方法を探しているだけです。

答えて

0

文字列の置換のほかに。 答えを使用しましたDave R - stack overflow

JSON.stringify(obj、replacer array)代替メソッドを使用してください。

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']); 

そのすべての鍵をリストする痛みを少し、それはまた、フィルタのように動作し、私は唯一の私も必要なものを返します。 そして、私は '__type'をすべてのオブジェクトとサブオブジェクトに入れたので、このキーはstringifyの後に最初にリストされました。

1

あなたのJSON操作することJson.Netを使用することができますが

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); 

このコードの出力は

[ 
    { 
    "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 " 
    } 
    } 
] 

あるしかし、私はJson.Netすべての方法を使用することをお勧めしますだけではなくにあなたのJSONに変換するでしょう希望のフォーマット。

+0

これは良い解決策です.Json.netの新しいバージョンにアクセスできる場合は、まずそれを試してみてください。残念ながら、バージョン2.0に依存している古いコードがあり、変更によって大きなテストが発生します。 –

+0

実験では、JSONを 'Newtonsoft.Json.Formatting.None'で再初期化する必要があることがわかりました。 '{'と '" __type "'の間に空白があっても、 'DataContractJsonSerializer'は型ヒントの処理に失敗します。 – dbc

関連する問題