c# – JSON数据结构 – 对象的JSON – 最佳实践

前端之家收集整理的这篇文章主要介绍了c# – JSON数据结构 – 对象的JSON – 最佳实践前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在努力使用 JSON,ASP.NET,typescript / javascript和AngularJS进行我的Web应用程序设计.

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

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

>控制器

> DataController(REST API)

>模型

> A.
>类型

模型类:

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;}
}

每个模型类的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>();
    }
    // ...
}

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

JSON结果如下所示:

[
    {"Id":1,"Type": {"Id":1,"Name":"name1"}
    },{"Id":2,"Type": {"Id":2,"Name":"name2"}
    },{"Id":3,"Name":"name1"}
    }
    {"Id":4,{"Id":5,]

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

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

[
    {"Id":1,"TypeId": {"Id":1}
    },"TypeId": {"Id":2}
    },"TypeId": {"Id":1}
    }
    {"Id":4,]

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

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

[
    {"Types": 
        [
                {"Id":1,"Name":"name1"},"Name":"name2"},]
    },{"As":
        [
            {"Id":1,"TypeId": {"Id":1}
            },"TypeId": {"Id":2}
            },"TypeId": {"Id":1}
            }
            {"Id":4,"TypeId": {"Id":2}
            }
        ]
    }
]

所以我想知道是否有最好的做法.作为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;
        });
    }
}

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

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

总结一下:我需要一种最佳实践,使用客户端的JSON字符串创建对象.

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

猜你在找的C#相关文章