1

Entity FrameworkでJSON.NETシリアライザーを使用していますが、出力されるJSONにやなどの「特別なプロパティ」が含まれている状況に遭遇しまし$id$ref。私が読んだところによると、これらのプロパティは純粋なJSONによって使用され、出力されたJSONを凝縮して、繰り返される要素を2回書き込む必要がないようにします。

したがって、出力されるJSONは次のようになります。

 var myArray = [
     {
         "ActiveStates": [
             {
                 "$id": "1",
                 "StateID": "CA",
                 "Name": "California"
             },
             {
                 "$id": "2",
                 "StateID": "NV",
                 "Name": "Nevada"
             }
         ],
         "DefaultState": {
             "$ref": "1"
         }
     }
 ];

Javascriptを使用して$ref、fromDefaultStateとfromAvailableStatesを$id使用してのを返すにNameはどうすればよいCaliforniaですか?

myArray.find(myArray.DefaultState.$ref).Name;に似たロジックで何かを返すかもしれないと思っていCaliforniaます。

うまくいけば、これはこのような簡単なものです。

編集: 要素が重複しているために出力されるJSONが長くなることを意味する場合でも、これらの「特別なプロパティ」が配列にレンダリングされないようにする方法を学ぶことも許容できる答えだと思います。

4

2 に答える 2

1

問題の解決策を見つけました: https://stackoverflow.com/a/4992429/1322509

上記のページ リンクにあるように、以下で定義されている getObjects 関数を使用しています。

var myArray = [
    {
    "AvailableStates": [
        {
        "$id": "1",
        "CityID": "CA",
        "Name": "California"},
    {
        "$id": "2",
        "CityID": "NV",
        "Name": "Nevada"}
    ],
    "DefaultState": {
        "$ref": "1"
    }}
];

var stateName = getObjects(myArray, '$id', myArray[0].DefaultState.$ref)[0].Name;

function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}​
于 2012-05-04T18:29:56.403 に答える
0

構成で無効にすることができました(NewtonSerialiser)

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = 
        Newtonsoft.Json.PreserveReferencesHandling.None;
    }
 }
于 2012-12-07T11:10:27.103 に答える