0

私はJSON.NETを使用していくつかのc#オブジェクトをJSONにシリアル化します(そしてファイルに書き込みます)。

私の2つの主なクラスは次のとおりです。

public class Reservoir {
    private Well[] mWells;

    public Well[] wells {
        get { return mWells; }
        set { mWells = value; }
    }
}

public Well() {
    private string mWellName;
    private double mY;
    private double mX;

    public string wellName {
        get { return mWellName; }
        set { mWellName = value; }
    }


    public double y {
        get { return mY; }
        set { mY = value; }
    }

    public double x {
        get { return mX; }
        set { mX = value; }
    }

    private Well[] mWellCorrelations;
}

問題は、出力が次のようになることです。

'{"wells":[{"wellName":"B-B10","y":217.04646503367468,"x":469.5776343820333,"wellCorrelations":[{"wellName":"B-B12","y":152.71005958395972,"x":459.02158140110026,"wellCorrelations":[{"wellName":"B-B13","y":475.0,"x":495.14804408905263,"wellCorrelations":[{"wellName":"B-B11","y":25.0,"x":50.0,"wellCorrelations":[]}

つまり、各ウェルオブジェクトの関連するウェルはオブジェクト自体として拡張され、関連するオブジェクトが多数ある場合、これは空間と時間の深刻な問題になります。

私は次のようなものを好んだと思います:

'{"wells":[{"wellName":"B-B10","y":217.04646503367468,"x":469.5776343820333,"wellCorrelations":[{"wellName":"B-B12"}], {"wellName":"B-B11","y":217.04646503367468,"x":469.5776343820333,"wellCorrelations":[{"wellName":"B-B13"}

つまり、リンクとしてウェル名のみを維持します(一意であると想定します)。

JSON.NETでこれを行う方法はありますか?

設定しました

serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

しかし、それは何の違いもありません。

4

1 に答える 1

1

次のように、ウェル相関の名前のみを取得するWellCorrelationsという新しい読み取り専用プロパティを追加し、JsonIngoremWellCorrelationsの属性をスラップすることができます。

[JsonIgnore]
private Well[] mWellCorrelations;

public string[] WellCorrelations 
{ 
    get { return mWellCorrelations.Select(w => w.wellName).ToArray(); }
}

http://james.newtonking.com/projects/json/help/html/ReducingSerializedJSONSize.htm

このように、シリアライザーは相関するウェルの名前のみをシリアル化します。

于 2013-01-29T00:30:31.793 に答える