JSON数据结构 - 对象的JSON - 最佳实践

bak*_*nin 6 javascript c# asp.net json typescript

我正在努力使用JSON,ASP.NET,typescript/javascript和AngularJS进行我的Web应用程序设计.

简而言之: 我需要一种最佳实践,通过JSON从服务器向客户端发送数据,使用客户端的JSON字符串创建对象.

我有一个WebServerAPI项目(ASP.NET)具有以下结构:

  • 控制器
    • DataController(REST API)
  • 模型
    • 一个
    • 类型

模型类:

public class A {
    public property int Id {get; set;}
    public property string Name {get; set;}
    public property Type Type {get; set;}
}

public class Type {
    public property int Id {get; set;}
    public property string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

每个模型类的id属于数据库表(主键)中的id.

DataController结构:

public class DataController : ApiController {
    // ...
    // GET api/a
    public IEnumerable<A> Get()
    {
        // fetches all As from the database
        // the facade creates instances of A and Type as required
        // (if A has a 'Type' the Type will also fetched an set)
        return facade.GetAll<A>();
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

DataController的Get()方法返回JSON结果.

JSON结果如下所示:

[
    {"Id":1,
     "Type": {"Id":1, "Name":"name1"}
    },
    {"Id":2,
     "Type": {"Id":2, "Name":"name2"}
    },
    {"Id":3,
     "Type": {"Id":1, "Name":"name1"}
    }
    {"Id":4,
     "Type": {"Id":2, "Name":"name2"}
    },
    {"Id":5,
     "Type": {"Id":2, "Name":"name2"}
    },  
]
Run Code Online (Sandbox Code Playgroud)

正如您在JSON数据中看到的,一些As共享相同的类型.虽然这是有效的JSON,但我想知道这是否是发送数据的最佳做法.

发送这样的东西不是更好:

[
    {"Id":1,
     "TypeId": {"Id":1}
    },
    {"Id":2,
     "TypeId": {"Id":2}
    },
    {"Id":3,
     "TypeId": {"Id":1}
    }
    {"Id":4,
     "TypeId": {"Id":2}
    },
    {"Id":5,
     "TypeId": {"Id":2}
    },  
]
Run Code Online (Sandbox Code Playgroud)

所以我们只得到类型的Id.但是我们必须要求所有可用的类型来识别必须在相应的As中设置哪个类型.哪个可能不好?我认为这可能很慢,因为我必须发送两个查询.

第三个选项可能是在相同的JSON结果中发送所有可用的类型和As.

[
    {"Types": 
        [
                {"Id":1, "Name":"name1"},
                {"Id":2, "Name":"name2"},
        ]
    },
    {"As":
        [
            {"Id":1,
            "TypeId": {"Id":1}
            },
            {"Id":2,
             "TypeId": {"Id":2}
            },
            {"Id":3,
             "TypeId": {"Id":1}
            }
            {"Id":4,
             "TypeId": {"Id":2}
            },
            {"Id":5,
             "TypeId": {"Id":2}
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有最好的做法.作为A中的嵌套对象一遍又一遍地发送相同的对象(Type)似乎非常"愚蠢".

特别是如果我将JSON字符串转换为Typescript对象.

没有任何"存储/缓存"逻辑,我一遍又一遍地创建"相同"的对象:

export class A {
    public Id: number;
    public Name: string;
    public Type: Type;

    public static fromData(data: any): A {

        var a = new A();
        a.Id = data.Id;
        a.Name = data.Name;
        a.Type = Type.fromData(data.Type);

        return a;
    }
}

export class Type {
        public Id: number;
        public Name: string;

        public static fromData(data: any) : Type {
            var type = new Type();
            type.Id = data.Id;
            type.Name = data.Name;

            return type;
        }
}

// AngularJS controller
export class AListCtrl {
    static $inject = ['$scope', '$http'];

    public As: A[] = [];

    constructor(private $scope, private $http) {
        $scope.AListCtrl = this;

        $http.get('http://localhost/api/a').success((data) => {
            var as: A[] = [];
            for (var i = 0; i < data.length; i++) {
                var aData = data[i];
                var a = A.fromData(aData);

                as.push(a);
            }

            this.As = as;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)



创建表示相同类型的不同对象似乎是错误的.因为我在其他语言(C#,Java,C++)中使用引用很多.使用这种反序列化数据和创建对象的方式根本不允许使用引用(可能这在Web应用程序中是错误的?).我还认为,生成大量无用的对象而不是每种类型的对象是浪费内存和CPU时间.

相当长的帖子,但我希望它能很好地解释我的问题.

总结一下: 我需要一种最佳实践,通过JSON从服务器向客户端发送数据,使用客户端的JSON字符串创建对象.

Gre*_*eri 3

我认为您需要定义对您的客户端应用程序最有意义的 JSON 表示形式,然后确保数据以该格式发送。我将创建一个自定义序列化器,使用内置的JavaScriptConverter或可能使用Json.Net提供的序列化器。仅使用内置序列化器似乎并不能给出理想的结果。