如何在JSON中挑选JSON



这是我的JSON由PHP Web应用程序返回:

{"subtotal":475,"tax":47.5,"discount_section":[{"amount":237.5,"name":"test prior for percentage discount
"}],"grand_total_incl_tax":332.5}

我使用c#和json.net解码abvoe json

var cart = webClient.DownloadString("http://localhost/m1/pos_addToCart.php?pidstr=" + pid_str);
dynamic result = JObject.Parse(cart);

但是在这一行上有一个错误:

order_discount_section.Text = result.discount_section;

错误:

Cannot implicitly convert type 'Newtonsoft.Json.Linq.JToken' to 'string' 

如何将此JSON转换为字符串:

Key1 = Value1
Key2 = Value2
Key3 = Value3

基于您提供的JSON discount_section是一张地图,因此不能表示为string。这就像试图将字典转换为stringarray转换为string

如果您希望它作为string表示,则在result.discount_section之后添加ToString()(即result.discount_section.ToString())应该实现这一目标。

尽管我建议您通过占位符值存储数据,例如:

string name = result.discount_section[0].name(数量相同,但浮点/十进制/双...)。

,或者如果您想要它作为文本为

text = "Name: " + result.discount_section[0].name 
       + "Amount: " + result.discount_section[0].amount.ToString();`

显然,使用StringBuilder或其他工具会更好(例如string.format),但我将其作为"练习"留给您。

编辑:所有结果的for循环。

totalText = ""
for (i = 0; i < result.discount_section.length; i++) {
    totalText += "Name: " + result.discount_section[i].name + "Amount: " + result.discount_section[i].amount.ToString() + "n";
}

显然,如果您想要一系列字符串,那么您只需构建一个数组,然后将I作为字符串阵列索引。

Json.NET提供了正确的行为。

从您的示例字符串中,可以看出,discount_section是JSON数组,或JArray,在分析至JObjectJToken的后代。

如果要访问此数组的内部成员,例如name,则应称其为

order_discount_section.Text = result.discount_section[0].name;

如果要按原样编写discount_section的完整符号,则应明确调用ToString方法:

order_discount_section.Text = result.discount_section.ToString();

,尽管在JSON中使用单独的服务响应时,处理dynamic S并没有用。最好定义一个可以处理JSON值的单个类,因此您不仅可以查看JSON的传递,而且可以使用它

您可以考虑使用对象工作,并使用jsonconvert.deserializeobject进行验证。示例:

class Discount
{
    public Decimal Amount { get; set; }
    public String Name { get; set; }
}
class Response
{
   public Decimal Subtotal { get; set; }
   public Decimal Tax { get; set; }
   public List<Discount> Discount_section { get; set; }
   public Grand_total_incl_tax { get; set; } 
}
var response = JsonConvert.DeserializeObject<Response>(cart);

当对象结构相对固定并且具有以下优点时,此方法是好的:

  • 清除结构
  • 当您患有类型不匹配(JSON->属性)
  • 时,相关错误

result.discount_section是收集。您无法直接设置为字符串变量。

尝试这个。

        var result= JObject.Parse(cart);
        dynamic[] discountSection = result["discount_section"].ToArray<dynamic>();
        decimal amount = discountSection[0].amount;
        decimal name = discountSection[0].name;

对于字典

Dictionary<string,decimal> discountDictionary =  discountSection.ToDictionary<dynamic, string, decimal>((d) => d.name, (d) => d.amount);

相关内容

  • 没有找到相关文章

最新更新