【问题标题】:Deserializing and working with a JSON object反序列化和使用 JSON 对象
【发布时间】:2017-05-15 11:13:45
【问题描述】:

我正在尝试从 Deserilized Json 对象中读取。 目前我正在使用以下代码来反序列化 JSON 数据:

var jsondecode = Newtonsoft.Json.JsonConvert.DeserializeObject(Request.Cookies.Get("wrkb").Value);

我的 JSON 对象的内容:

{{
  "shoppingbasket": [
    {
      "price": 12,
      "product": "Lachum",
      "quantity": 2,
      "total": 24
    },
    {
      "price": 2,
      "product": "Laici",
      "quantity": 3,
      "total": 12
    },
    {
      "price": 12,
      "product": "Lachum",
      "quantity": 1,
      "total": 12
    }
  ]
}}

我想将此 JSON 字符串转换为我可以使用的 .Net 对象集合。

例如,我希望能够在反序列化对象后生成这种类型的输出。

Shoppingbasket:
1) Product = Lachum, Price = 12, Quantity = 3, Total = 36
2) Product = Laici, Price = 2, Quantity = 3, Total = 6

Total-Price of basket = 42

这是我的解决方案,但是 pstrjds 的解决方案很优雅:

 DataSet dataSet = Newtonsoft.Json.JsonConvert.DeserializeObject<DataSet>(Request.Cookies.Get("wrkb").Value);
    DataTable dataTable = dataSet.Tables["shoppingbasket"];

    string print = "";
    double basket_total = 0.0;
    foreach (DataRow row in dataTable.Rows)
    {
        print = "Product= " + row["product"] + " Price= " + row["price"] + " Quantity= " + row["quantity"] + " Total= " + row["total"];
        basket_total += Convert.ToInt32(row["total"]);
        <div class="row">
            <ul class="col-md-12">
                <li><div class="col-md-12">@print</div></li>
            </ul>
        </div>
    }

现在我必须修复重复的项目

【问题讨论】:

  • 您能否进一步澄清您的问题。 “我应该如何从这个对象中读取”是什么意思?你表明你正在反序列化它,你到底坚持了什么? JSON.Net 有一个通用的反序列化选项,为您的预期数据创建一个类并反序列化这些对象的数组。
  • 我的意思是如何使用这个对象?是数组吗?
  • 我稍微改写了这个问题并修复了损坏的 JSON(缺少一些引号)。如果我没有正确地重申问题,请随时编辑。

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


【解决方案1】:

首先,您需要创建一个类来处理返回的对象(假设您提前知道要得到什么)。

public class ShoppingbasketItem
{
    public double price { get; set; }
    public string product { get; set; }
    public int quantity { get; set; }
    public int total { get; set; }
}
public class Shoppingbasket
{
    public List<ShoppingbasketItem> shoppingbasket { get; set; }
}

然后您可以将对象反序列化为您的 C# 代码,然后从那里对它们执行任何您需要的操作。

var products = Newtonsoft.Json.JsonConvert.DeserializeObject<Shoppingbasket>(Request.Cookies.Get("wrkb").Value);

因此,要计算总数的总和,您只需从篮子中迭代列表即可。

double totalSum = 0.0;
foreach(var item in products.shoppingbasket)
{
    totalSum += item.quantity * item.price;
}

编辑
要实现您正在寻找的分组,您可以执行以下操作。这可能不是最好的解决方案,但这是我想到的。

var grouped = new Dictionary<string, ShoppingbasketItem>();

foreach (var item in products.shoppingbasket)
{
    ShoppingbasketItem temp = null;
    if (grouped.TryGetValue(item.product, out temp))
    {
        temp.quantity += item.quantity;
        temp.total += item.total;
    }
    else
    {
        grouped[item.product] = item;
    }
}

【讨论】:

  • 非常感谢。这对我来说似乎是最好的解决方案!但是我怎样才能总结存在两次或更多的项目呢?
  • @cgame92 - 我添加了一个编辑,显示了实现分组的一种方法。一般来说,您在 SO 上发布一个新问题,而不是添加 cmets 或修改原始问题以提出新问题。
【解决方案2】:

如果你不指定反序列化的类型,你会得到一个 jObject。它的属性是在运行时推导出来的。

dynamic result = JsonConvert.DeserializeObject(json);

现在,还有另一种获取 jObject 的方法。

var result = jObject.Parse(json);
var sessionKey = p.GetValue("SessionKey").Value<string>();

Read this。如果您不知道前面的类型(如您的情况),是否使用反序列化或解析没有真正的区别。无论哪种方式,您都会得到一个 jObject。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2016-11-20
    • 2011-05-09
    • 2021-12-17
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多