【问题标题】:Json fields orderJson 字段顺序
【发布时间】:2012-09-27 08:21:35
【问题描述】:

我有一个用 RavenDB 以这种方式存储的模型:

public abstract class Animal
{
   public string Id { get; set; }
   public int LegsNumber { get; set; }
}

public class Giraffe: Animal
{
   public double NeckLength { get; set; }
}

在我的 MVC 控制器中,我查询所有 Giraffe 并以这种方式将结果放入 Json 格式:

return new JsonResult 
{ 
   JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet, 
   Data = DocumentSession.Query<Giraffe>() 
};

输出类似于

[{"NeckLength":2.5, "Id":"bob", "LegsNumber":4}, {...}, ...]

如何自定义字段顺序以获得这样的结果:

[{"Id":"bob", "LegsNumber":4, "NeckLength":2.5}, {...}, ...]

?

如果您好奇并且想知道我为什么要更改顺序是因为我有一个通用的 javascript sn-p 可以获取 json 并按原样打印出来:

 for (var field in data[0]) {
    var row = '<tr>';
    row += '<td><b>' + field + '</b></td>'

    $.each(data, function (i, value) {
       row += '<td>' + value[field] + '</td>'
    });

    row += '</tr>';
    result += row;
 }

【问题讨论】:

  • 你为什么要这样......顺序在 JSON 中并不重要
  • 因为: - 我需要按特定顺序打印数据 - 我不想添加订单字段 - html/js 对数据一无所知。只需打印每个字段名称和对应的值
  • 一种变通方法是在字段名称中硬编码订单号(例如 Id_1、LegsNumber_2、NeckLength_3)并使用它对结果进行排序,但不是很优雅

标签: asp.net-mvc json ravendb


【解决方案1】:

尝试使用 JsonPropertyAttribute 为您的字段赋予属性,如下所示:

public abstract class Animal
{
   [JsonProperty(Order = 0)]
   public string Id { get; set; }

   [JsonProperty(Order = 1)]
   public int LegsNumber { get; set; }
}

public class Giraffe: Animal
{
   [JsonProperty(Order = 2)]
   public double NeckLength { get; set; }
}

【讨论】:

  • 对!这就是我需要的。不幸的是,它不会影响 JsonResult 类的行为,但是我将它替换为 Newtonsoft.Json.JsonConvert 并像魅力一样工作。谢谢
  • 唯一的问题是效率有点低:从 RavenDb (json) 将结果序列化为 POCO,然后再次将它们反序列化为 json。我认为有一个简单的方法,但这是一个完全不同的问题。
【解决方案2】:

Json 不提供基于索引的访问。 相反,您可以尝试这样的事情

for (int i = 0; i < Data.length(); i++) {
 var item=Data.[i];

 var row = '<tr>';
  row += '<td><b>' +item['Id'] + '</b></td>'+'<td><b>' +item['LegsNumber'] + '</b></td>'
 +item['NeckLength'] + '</b></td>'+'<tr>';
}

【讨论】:

  • 没有基于索引的访问 好的。但它给出了字段列表。有没有办法改变字段列表的顺序?您的解决方案对我不起作用,因为脚本必须在不知道字段名称的情况下与任何 Json 结构一起使用
  • Json 没有维持秩序。尽管如此,如果您想保持顺序,请为每个包含排序顺序的项目添加一个整数字段,并编写一些自定义的 javascript 排序方法。
猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 2019-05-24
  • 2013-07-02
  • 2022-01-03
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多