2016-10-31 34 views
2

C#/ JSON.NetクライアントでJackson(Java/Springサーバー)によって生成されたJSON文字列をデシリアライズできるようにする必要があります。 Jacksonは循環参照のために "@ id":1 ... nを使いますが、参照は単一の整数で表されます。 JSON.Netは "$ id"と "$ ref"を使用します。Jackson JSONオブジェクト参照をJSON.Netオブジェクト参照に変換する

誰かがJSON文字列をJacksonからJSON.Net互換バージョンに変換する方法を知っていますか?ここで

+1

ありがとうございました。あなたはあなたの投稿を編集して質問のように表現できるように親切にして、あなたの解決策を質問の回答欄に移動しますか?そのフォーマットはこのサイトでうまく機能し、他の人が追加の解決策を提供できるようになります。 –

+0

@Brian ....やりました、今は大丈夫ですね;-) – vogje01

+0

ありがとう!私はいくつかの非常にマイナーな編集をしましたが、そうでなければうまく見えます。 –

答えて

1

は私のソリューションです:

はJSON.Netのためにこれらの設定を使用します。参照を変換する

JsonSerializerSettings settings = new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
}; 

使用このインターセプタ:

public static class JSONInterceptor 
{ 
    public static string sanitizeJSON(string originalJSONFromJava) 
    { 
     // Get ID right from Jackson to JSON.Net 
     string pattern = Regex.Escape(@"""@id"":") + "(\\d+)"; 
     string replacement = @"""$id"":""$1"""; 
     Regex rgx = new Regex(pattern); 
     string output = rgx.Replace(originalJSONFromJava, replacement); 

     // Convert Jackson reference in array 
     pattern = @",(\d+)"; 
     replacement = @",{""$ref"":""$1""}"; 
     rgx = new Regex(pattern); 
     output = rgx.Replace(output, replacement); 

     // Convert single Jackson reference to ref 
     pattern = Regex.Escape(@"""\\w+"":") + "(\\d+)"; 
     replacement = @"""$ref"":""$1"""; 
     rgx = new Regex(pattern); 
     output = rgx.Replace(output, replacement); 

     return output; 
    } 
} 

インターセプターを呼び出し、このようにデシリアライズを:

asset = JsonConvert.DeserializeObject<Asset>(JSONInterceptor.sanitizeJSON(response), settings); 
(JSON.Net)のようなものに変換する必要がある

{"@id":1,......."parent":{"@id":15,.....},"agents":[{"@id":6, ......},12,{...}]...} 

{"$id":"1",...,"$ref":"15",....,"agents":[{...,"$ref":"6",...]} 

public class Asset { 

    .... 

    // Parent asset 
    public Asset parent; 
    // Asset agents 
    public List<Agents> agent; 

    .... 
} 

ので、ジャクソンのようなものを生成します:の

資産クラスは、このレイアウトを持っています

これは上記のコードの機能です。

希望すると、誰かに役立ちます。

関連する問題