这是我的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
。这就像试图将字典转换为string
或array
转换为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
,在分析至JObject
后JToken
的后代。
如果要访问此数组的内部成员,例如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);