1

我将 JSON.NET 序列化程序与 Entity Framework 一起使用,并且遇到了这样一种情况,即输出的 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,我如何使用$reffrom DefaultState 和$idfrom AvailableStates 返回Nameof California

我在想一些逻辑类似于myArray.find(myArray.DefaultState.$ref).Name;which may return的东西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 回答