我正在使用带有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会更长。
答案 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;
}
}