如何在JSON.NET中禁用特殊属性或正确处理它们

时间:2012-05-03 23:27:23

标签: c# javascript json serialization json.net

我正在使用带有Entity Framework的JSON.NET序列化程序,并且遇到输出的JSON包含这些“特殊属性”的情况,例如$id$ref。根据我的阅读,纯JSON使用这些属性来压缩输出的JSON,以便重复的元素不必写入两次。

因此,输出的JSON是这样的:

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

使用Javascript,如何使用DefaultState中的$ref和AvailableStates中的$id来返回Name的{​​{1}}?

我正在考虑类似于California的逻辑,可能会返回myArray.find(myArray.DefaultState.$ref).Name;

希望这很简单。

修改 我也认为这是一个可以接受的答案,学习如何禁止这些“特殊属性”被渲染到数组,即使它意味着由于重复元素而输出的JSON会更长。

2 个答案:

答案 0 :(得分: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;
}​

答案 1 :(得分:0)

我设法在配置中禁用它(NewtonSerialiser)

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = 
        Newtonsoft.Json.PreserveReferencesHandling.None;
    }
 }