我有一个C#应用程序,该程序从数据包(项目名称+项目ID +项目计数)中读取播放器清单。我找到了一个网站,可以在其中找到商品名称+数量/价格,但其格式为json:
"AI Brain": {
"qty":15,
"price":1
},
"Air Conditioner": {
"qty":190,
"price":1
}
所以现在在我的检查器中,我跟踪了玩家的库存并获得了物品名称。我需要使用json格式来获取商品的数量和价格。我怎样才能做到这一点?有很多东西...
答案 0 :(得分:1)
签出https://json2csharp.com/和https://jsonlint.com/的主要问题是,这是一个糟糕的设计,因为每个商品名称都变成了一个新类,而您想要的是诸如下面的内容,其中包含了封装和项目,以及@ Flydog57说
.container {
overflow-y: auto;
position: relative;
height: 400px;
}
.backdrop {
z-index: 1000;
position: absolute;
top: 0;
left: 0;
background: rgba(0, 100, 0, 0.2);
width: 100%;
height: 100%;
display: block;
}
p {
color: #FFF;
z-index: 1000;
position: absolute;
margin: auto;
width: 100%;
top:100px;
font-weight: 400;
font-size: xx-large;
text-align: center;
}
.content {
grid-template-columns: repeat(3, 1fr);
display: grid;
grid-auto-rows: 60px;
grid-row-gap: 0px;
grid-column-gap: 2px;
}
.cell {
border: 2px solid red;
}
c#
<div class="container">
<div class="backdrop"><p>
Wait
</p></div>
<div class="content">
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
<div class="cell"></div>
</div>
</div>
vs
split
答案 1 :(得分:1)
另一种方法是将其反序列化为Dictionary。在这里,我使用的是NewtonSoft JSON Nuget包。
首先创建一个定义每个项目的属性的类:
public class TestItem
{
public int qty { get; set; }
public int price { get; set; }
}
然后将其反序列化为字典。请注意,您可以在Javascript中使用单引号或双引号(因此使用JSON)。我在这里使用单引号而不是双引号-这样可使代码更清晰。另外请注意,我添加了前导{
和后缀}
来将您的字符串转换为合法的JSON:
public static void Deserialize()
{
var someJson = "{'AI Brain':{ 'qty':15,'price':1},'Air Conditioner':{ 'qty':190,'price':1}}";
var results = JsonConvert.DeserializeObject<Dictionary<string, TestItem>>(someJson);
}
此操作的结果是一个包含两个项的字典,每个项都有一个string
Key 和一个TestItem
Value 。>
如果您正在从文件中读取数据,则可以不加引号,而只需在读入字符串后将"{"
连接到开头并将"}"
连接到结尾即可。像这样:
var fileContents = File.ReadAllText("TestItem.json");
var fileJson = "{" + fileContents + "}";
var resultsFromFile = JsonConvert.DeserializeObject<Dictionary<string, TestItem>>(fileJson);
(假设您显示的JSON位于名为"TestItem.json"
的文件中)
这是反序列化的对象在调试器中的样子:
答案 2 :(得分:0)
如果您不想创建类(btw的一种很好的做法),则可以使用动态包和Newtonsoft.json包:
@Html.Label("", "My.Cool.Label")
输出:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
//note: needed to fix json here
var json = @"{""AI Brain"":{ ""qty"":15,""price"":1},""Air Conditioner"":{ ""qty"":190,""price"":1}}";
//note2: dynamic is tricky and sensitive for typos.
dynamic obj = JObject.Parse(json);
//if you know what you want upfront, you can just do
//Console.WriteLine(obj["AI Brain"].qty);
//you can also loop them like this:
foreach (var pair in obj)
{
Console.WriteLine(pair.Name);
Console.WriteLine(obj[pair.Name].qty);
Console.WriteLine(obj[pair.Name].price);
}
}
}
}
答案 3 :(得分:0)
您可以使用Newtonsoft.Json,动力学和属性发现来执行以下操作:
using Newtonsoft.Json;
//...
var json = "{'AI Brain':{ 'qty':15,'price':1},'Air Conditioner':{ 'qty':190,'price':1}}";
dynamic obj = JsonConvert.DeserializeObject(json);
foreach(var property in obj.Properties())
Console.WriteLine($"{property.Name}: {property.Value.qty} @ {property.Value.price:c}");