您能帮我解析此JSON吗?

时间:2020-10-14 13:53:09

标签: c# json .net parsing

我有一个C#应用程序,该程序从数据包(项目名称+项目ID +项目计数)中读取播放器清单。我找到了一个网站,可以在其中找到商品名称+数量/价格,但其格式为json:

"AI Brain": {
  "qty":15,
  "price":1
},
"Air Conditioner": {
  "qty":190,
  "price":1
}

所以现在在我的检查器中,我跟踪了玩家的库存并获得了物品名称。我需要使用json格式来获取商品的数量和价格。我怎样才能做到这一点?有很多东西...

4 个答案:

答案 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"的文件中)

这是反序列化的对象在调试器中的样子:

The deserialized object looks like in the debugger

答案 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}");