【问题标题】:Read Json data C#读取 Json 数据 C#
【发布时间】:2015-05-26 11:58:12
【问题描述】:

我的控制器中有以下方法

public JsonResult Data()
{
    return Json(details
        .Select(c => new { Height = c.Height, Width = c.Width })
        .Distinct(),
      JsonRequestBehavior.AllowGet);
}

我正在读取如下数据

public void ReadData()
{
  var result = controller.Data() as JsonResult;
  var model = result.Data;
}

如何在 ReadData 中正确地转换 var 模型

【问题讨论】:

  • 你想反序列化数据吗?

标签: c# json asp.net-mvc-4


【解决方案1】:

JsonResult 数据将在 jsonResult.ExecuteResult 调用期间被迭代和序列化,但如果您只想要它将生成的 json 数据 - 您可以手动使用 JsonResult 使用的相同 json 序列化程序。所以它会是这样的:

public void ReadData()
{
    var result = controller.Data() as JsonResult;
    var model = result.Data;
    JavaScriptSerializer scriptSerializer = new JavaScriptSerializer();
    string json = scriptSerializer.Serialize(model);
}

【讨论】:

  • 使用 Newtonsoft Json 会是更好的选择。对于许多复杂类型,它的性能更好。
【解决方案2】:

您看到的是 System.Linq.Enumerable.DistinctIterator<<>f__AnonymousType2<string,string>>,因为这正是您返回的内容:具有两个字符串属性的匿名类型的可枚举。

您可以对其进行迭代:

var model = result.Data;
foreach (var dimension in model)
{
    int h = dimension.Height;
    int w = dimension.Width;
}

但是,如果 API 方法在同一个项目中,您不希望绕过 JSON 序列化和反序列化往返。

要么引入具体类型(与匿名类型相反)并更改 API 控制器的返回类型:

public class Dimension
{
    public int Height { get; set; }
    public int Width { get; set; }
}

public IEnumerable<Dimension> Data()
{
        return details.Select(c => new Dimension { Height = c.Height, Width = c.Width }).Distinct();
}

或者把逻辑放在自己的类中:

public class DimensionGetter
{
    public IEnumerable<Dimension> GetDimensions()
    {
         return details.Select(c => new Dimension { Height = c.Height, Width = c.Width }).Distinct();
    }
}

并从两种方法调用该类:

public JsonResult Data()
{
    return Json(new DimensionGetter.GetDimensions(), JsonRequestBehavior.AllowGet);
}

public void ReadData()
{
    var model = new DimensionGetter.GetDimensions();
}

【讨论】:

  • 很好。关心具体分享哪个错误?
【解决方案3】:

您可以手动使用与 JsonResult 相同的 json 序列化程序。所以它会是这样的:

JavaScriptSerializer scriptSerializer = new JavaScriptSerializer();
string json = scriptSerializer.Serialize(model);

【讨论】:

    【解决方案4】:
    using System.Web.Script.Serialization;
    
       public void ReadData()
       {
          var result = controller.Data() as JsonResult;
          var model = result.Data;
    
          JavaScriptSerializer javaScriptSerializerObject = new JavaScriptSerializer();
          Response.Write(javaScriptSerializerObject.Serialize(model));
       }
    

    【讨论】:

    • 它无法正常工作,因为您将 JsonResult 本身传递给序列化程序,而不是 Data 属性的值。所以它也会序列化所有JsonResult 属性,而不仅仅是一个
    【解决方案5】:

    我认为 JavaScriptSerializer()Serialize 可以胜任

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多