【问题标题】:accessing json property with given values使用给定值访问 json 属性
【发布时间】:2020-11-04 11:20:53
【问题描述】:
var orderJson = JsonConvert.DeserializeObject<dynamic>(httpResultStr);
                var orderidCount = orderJson.data.orderUuids.Count;
                for (int i = 0; i <= orderidCount; i++)
                {
                    var orderId = orderJson.data.orderUuids[i]; // my fail attempt. Didnt work
                    var map = orderJson.data.ordersMap;   
                    foreach (var d in map)
                    {
                        var receipt = d.fareInfo.totalPrice;
                        Console.WriteLine(receipt);
                    }
                 
                } 

我正在尝试使用 orderUuids 对象中的给定值访问 ordersMap 成员。在 ordersMap Ids 中包含我试图访问的 fareInfo.totalPrice 属性。我将如何实现这一目标?

[![带有ordersMap的json树。尝试使用 orderUuids 对象中的给定值访问其成员。][1]][1]

【问题讨论】:

  • 为什么要使用动态的,只是正常反序列化为强类型类?
  • 它只会使用 ordersMap 对象中的订单 ID 作为类,所以它不会工作
  • 能否请edit 将您的JSON 包含为文本,而不是屏幕截图?在 stackoverflow 上,我们要求问题包括文本数据,例如代码、错误消息、异常详细信息和数据(JSON、XML 等)作为文本,而不是图像。原因见Why not upload images of code on SO when asking a question和Discourage screenshots of code and/or errors。
  • 它有足够的信息。我只是想访问 ordersMap 属性。有任何知识的人可以在这里帮助我吗?
  • @userafg 你能扩展一个ordersMapchildren 吗?

标签: c# .net json dynamic json.net


【解决方案1】:

您可以使用 JSON 文件制作部分/完整地图并使用JsonConvert.DeserializeObject&lt;&gt;(json)。

其他解决方案可能是使用匿名类型创建部分地图。这是一个代码片段。

var anonymousTypeObject = new
{
    status = "",
    data = new
    {
        ordersMap = new Dictionary<string, JToken>(),
        orderUuids = new string[0]
    }
};
var obj = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
foreach (var kvp in obj.data.ordersMap)
{
    var totalPrice = kvp.Value["fareInfo"]?["totalPrice"]?.ToString();
    Debug.WriteLine($"{kvp.Key} -> {totalPrice}");
}

编辑如果您不想要任何地图,请使用此解决方案。

var jObj = JsonConvert.DeserializeObject<JObject>(json);
var orderUuids = jObj.SelectToken("data.orderUuids")?.Values<string>();
foreach (var orderUuid in orderUuids)
{
    var totalPrice = jObj.SelectToken($"data.ordersMap.{orderUuid}.fareInfo.totalPrice")?.Value<double>();
    Debug.WriteLine($"{orderUuid} -> {totalPrice}");
}

【讨论】:

  • 哇,非常感谢!我使用了不映射的第二种解决方案。
猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多