繁体   English   中英

反序列化 JSON 字符串的值为 0

[英]Value from deserialized JSON string is 0

我正在尝试使用 Brickset API ( https://brickset.com/article/52664/api-version-3-documentation ) 将 Json 字符串写入控制台时显示件数正确。 然而,在反序列化之后,仅将 pieces 的值写入控制台后,它显示为 0。写入控制台时,所有其他属性也不会显示。

将 Json 字符串写入控制台后的结果

{"status":"success","matches":1,"sets":\[
{
"setID": 31844,
"number": "10293",
"numberVariant": 1,
"name": "Santa's Visit",
"year": 2021,
"theme": "Icons",
"themeGroup": "Model making",
"subtheme": "Winter Village Collection",
"category": "Normal",
"released": true,
"pieces": 1445,
"minifigs": 4,
"image": {
"thumbnailURL": "https://images.brickset.com/sets/small/10293-1.jpg",
"imageURL": "https://images.brickset.com/sets/images/10293-1.jpg"
},
"bricksetURL": "https://brickset.com/sets/10293-1",
"collection": {},
"collections": {
"ownedBy": 9350,
"wantedBy": 2307
},
"LEGOCom": {
"US": {
"retailPrice": 99.99,
"dateFirstAvailable": "2021-09-17T00:00:00Z"
},
"UK": {
"retailPrice": 89.99,
"dateFirstAvailable": "2021-09-17T00:00:00Z"
},
"CA": {
"retailPrice": 139.99,
"dateFirstAvailable": "2021-09-17T00:00:00Z"
},
"DE": {
"retailPrice": 99.99,
"dateFirstAvailable": "2021-09-17T00:00:00Z"
}
},
"rating": 4.3,
"reviewCount": 0,
"packagingType": "Box",
"availability": "LEGO exclusive",
"instructionsCount": 15,
"additionalImageCount": 13,
"ageRange": {
"min": 18
},
"dimensions": {
"height": 28.0,
"width": 47.9,
"depth": 8.7,
"weight": 1.656
},
"barcode": {
"EAN": "5702016914313"
},
"extendedData": {
"tags": \[
"Santa Claus|n",
"18 Plus",
"Baked Goods",
"Bedroom",
"Bird",
"Brick Built Tree",
"Brick Separator",
"Christmas",
"Christmas Tree",
"D2c",
"Fireplace",
"Furniture",
"House",
"Kitchen",
"Light Brick",
"Mail",
"Microscale",
"Musical",
"Rocket",
"Seasonal",
"Winter Village"
\]
},
"lastUpdated": "2022-10-03T08:24:39.49Z"
}
\]}

主要代码

class Program
{

        static async Task Main(string[] args)
        {
            await askSetNumber();
        }
    
        private async Task GetPosts(string url)
        {
    
            HttpClient client = new HttpClient();
    
            string response = await client.GetStringAsync(url);
            Console.WriteLine(response);
    
            var set = JsonConvert.DeserializeObject<Rootobject>(response);
            Console.WriteLine(set.pieces); 
        }
    
        static async Task askSetNumber()
        {
            Console.WriteLine("Please enter a setnumber: ");
            string setNumber = "{'setNumber':'" + Console.ReadLine().ToString() + "-1'}";
            string url = "https://brickset.com/api/v3.asmx/getSets?apiKey=[APIKey here]&userHash=&params=" + setNumber;
            Console.WriteLine(url);
            Program program = new Program();
            await program.GetPosts(url);
        }
    }

我通过将 Json 粘贴为类来创建所有类,这是 object 的 class 我需要关闭数据

public class Rootobject
    {
        public int setID { get; set; }
        public string number { get; set; }
        public int numberVariant { get; set; }
        public string name { get; set; }
        public int year { get; set; }
        public string theme { get; set; }
        public string themeGroup { get; set; }
        public string subtheme { get; set; }
        public string category { get; set; }
        public bool released { get; set; }
        public int pieces { get; set; }
        public int minifigs { get; set; }
        public Image image { get; set; }
        public string bricksetURL { get; set; }
        public Collection collection { get; set; }
        public Collections collections { get; set; }
        public Legocom LEGOCom { get; set; }
        public float rating { get; set; }
        public int reviewCount { get; set; }
        public string packagingType { get; set; }
        public string availability { get; set; }
        public int instructionsCount { get; set; }
        public int additionalImageCount { get; set; }
        public Agerange ageRange { get; set; }
        public Dimensions dimensions { get; set; }
        public Barcode barcode { get; set; }
        public Extendeddata extendedData { get; set; }
        public DateTime lastUpdated { get; set; }
    }

我尝试了如何从 C# 中的 JSON 字符串中获取一些值的示例? 但是 set.pieces 一直返回 0。

这是我第一次尝试这种东西,但我被困在这部分。

Rootobject 不包含与您输出到控制台的 json 字符串相同的信息(出于某种原因它也转义方括号),因此您需要指定整个 object 或导航 json 树以获取所需的值。

这不是一个特别好的或稳健的解决方案,但您可以将代码的var set部分替换为:

        JsonDocument doc = JsonDocument.Parse(response);
        if (!doc.RootElement.TryGetProperty("sets", out JsonElement sets)) return;
        foreach(var set in sets.EnumerateArray())
        {
            if (!set.TryGetProperty("pieces", out JsonElement pieces)) continue;
            Console.WriteLine(pieces.GetInt32());
        }

(您还需要using System.Text.Json;而不是 newtonsoft 的。)

一开始你有 json,因为你有一些奇怪的“/”字符,之后你也必须修复你的课程

json=json.Replace("\\[","[").Replace("\\]","]");

 Set set = JsonConvert.DeserializeObject<Set>(json);

public class Set
{
    public string status { get; set; }
    public int matches { get; set; }
    public List<SetItem> sets { get; set; }
}

public class SetItem
{
    public int setID { get; set; }
    public string number { get; set; }
    public int numberVariant { get; set; }
    public string name { get; set; }
    public int year { get; set; }
    public string theme { get; set; }
    public string themeGroup { get; set; }
    public string subtheme { get; set; }
    public string category { get; set; }
    public bool released { get; set; }
    public int pieces { get; set; }
    public int minifigs { get; set; }
    public Image image { get; set; }
    public string bricksetURL { get; set; }
    public Collection collection { get; set; }
    public Collections collections { get; set; }
    public LEGOCom LEGOCom { get; set; }
    public double rating { get; set; }
    public int reviewCount { get; set; }
    public string packagingType { get; set; }
    public string availability { get; set; }
    public int instructionsCount { get; set; }
    public int additionalImageCount { get; set; }
    public AgeRange ageRange { get; set; }
    public Dimensions dimensions { get; set; }
    public Barcode barcode { get; set; }
    public ExtendedData extendedData { get; set; }
    public DateTime lastUpdated { get; set; }
}
public class LEGOCom
{
    public Country US { get; set; }
    public Country UK { get; set; }
    public Country CA { get; set; }
    public Country DE { get; set; }
}
public class AgeRange
{
    public int min { get; set; }
}

public class Barcode
{
    public string EAN { get; set; }
}

public class Country
{
    public double retailPrice { get; set; }
    public DateTime dateFirstAvailable { get; set; }
}

如果您有更多的国家/地区,那么将 LEGOCom 定义为字典也许有意义

public Dictionary<string,Country> LEGOCom { get; set; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM