0

所以,我一直在使用这个对象

public class OrdenCompra
    {
        public String Proveedor { get; set; }
        public String EmitidaPor { get; set; }
        public String NumOrden { get; set; }
        public String TipoPago { get; set; }
        public String Descuento { get; set; }
        public String Recargo { get; set; }
        public String Observacion { get; set; }
        public List<DetalleOrden> Detalle { get; set; }

        public ObjectId Id { get; set; }
        public OrdenCompra() { this.Id = ObjectId.GenerateNewId(); }
        public OrdenCompra(ObjectId id) { this.Id = id; }
    }

我可以使用常规对象,并且在我的应用程序中没有问题,但我需要将所有数据导出到 html 文件,如报告。

制作一个 html 标记并使用 jQuery 将 json 文件中的所有数据放到 html 中。

我只是用常规方式调用它

public String JsongetOrdenCompra(String orden)
        {
            try
            {
                return this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden)).ToJson();
            }
            catch (Exception e)
            {
                throw new Exception("Error al obtener Orden de Compra. \n"+e.Message);
            }
        }

问题是“_id”键,所以 json 看起来像

{“键”:“值”,“bla”:“bla”,“_id”:ObjectId(“516d3f86a3e2c814ac7ca180”)}

所以我无法解析它......

我知道有 SetFields(Exclude("_id")) 方式,但我不能使用FindOneAs ...

谢谢 !

4

2 回答 2

1

最终使用 C# DataContractJsonSerializer

首先,使用System.Runtime.Serialization 添加;到你的班级(和项目)。

然后将 [DataMember] 添加到您的所有属性中,例如

[DataMember]
public String Proveedor { get; set; }
[DataMember]
public String EmitidaPor { get; set; }
//and so on

现在在你的控制器上

ClasesProClean.OrdenCompra Orden = HO.getOrdenCompra(orden);
DataContractJsonSerializer serializer =  new DataContractJsonSerializer(Orden.GetType());
System.IO.MemoryStream ms = new System.IO.MemoryStream();
serializer.WriteObject(ms, Orden);
String json = Encoding.Default.GetString(ms.ToArray());

输出:

{"Descuento":"5%","Detalle":[{"Cantidad":60,"CodProveedor":"45AB","Precio":600,"Producto":"Betún","Total":36000},{"Cantidad":1000,"CodProveedor":"3D2","Precio":1000,"Producto":"Cera para piso flotante","Total":1000000}],"EmitidaPor":"Mario Cares","Id":{"_increment":8167808,"_machine":10740424,"_pid":5292,"_timestamp":1366114182},"NumOrden":"45","Observacion":"A la brevedad","Proveedor":"Atilio Di Gianmmarino S.","Recargo":"10%","TipoPago":"Contado"}

这就是我一直在寻找的,一个可读的 json ;)

于 2013-04-16T13:43:09.683 回答
1

MongoDBToJson扩展方法的行为有点奇怪 - 它可以配置,但输出往往难以使用。我建议您使用ServiceStack.TextorJavaScriptSerializer作为 Json 序列化程序,如下所示:

public string JsongetOrdenCompra(String orden)
{
    try
    {
        var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
        var s = new System.Web.Script.Serialization.JavaScriptSerializer();
        var result = s.Serialize(data);
        return result;
        // Alternatively, ServiceStack.Text.JsSerializer or 
        // extension methods like ASP.NET MVC's Json()
    }
    catch (Exception e)
    {
        throw new Exception("Error al obtener Orden de Compra. \n"+e.Message);
    }
}

所有这一切都不是最佳实践,因为您向公众展示了所有数据,并且在公众和数据库之间没有额外的验证和验证级别。

更好的方法通常是创建数据传输对象 (DTO)并映射数据,例如使用AutoMapper,如下所示:

public class OrdenDTO 
{
    public String Proveedor { get; set; }
    public String EmitidaPor { get; set; }
}

public class OrdenReadDTO : OrdenDTO
{
    public ObjectId Id { get; set; }
}

{
...
  var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
  var dto = AutoMapper.Mapper.DynamicMap<OrdenReadDTO>(dto);
  var s = new System.Web.Script.Serialization.JavaScriptSerializer();
  var string = s.Serialize(data);
  return string;
}

这个想法是OrdenDTO包含可以发送到服务器的所有信息,OrdenReadDTO还包含可以从服务器读取的所有数据。通常,ID 是只读的。

如果您使用的是 ASP.NET MVC 或类似框架,通常有一些方法可以处理实际的域对象,如下所示:

public ActionResult JsongetOrdenCompra(String orden)
{
    // Assuming ASP.NET MVC
    try
    {
        var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
        var dto = AutoMapper.Mapper.DynamicMap<OrdenReadDTO>(dto);
        return Json(dto);
    }
    catch (Exception e)
    {
        throw new Exception("Error al obtener Orden de Compra. \n"+e.Message);
    }
}
于 2013-04-16T13:17:32.210 回答