[英]How do I convert this JSON file into a custom c# Object
我正在尝试创建一种将整个json文件转换为我的自定义数据类型(称为产品)的方法
{
"unique_image_url_prefixes":[
],
"products_and_categories":{
"Tops/Sweaters":[
{
"name":"Knit Stripe S/S Raglan Top",
"id":302418,
"image_url":"//d17ol771963kd3.cloudfront.net/129807/ca/_9UoFPZi8Zs.jpg",
"image_url_hi":"//d17ol771963kd3.cloudfront.net/129807/rc/_9UoFPZi8Zs.jpg",
"price":9900,
"sale_price":0,
"new_item":true,
"position":10,
"category_name":"Tops/Sweaters",
"price_euro":11600,
"sale_price_euro":0
}
],
"Shirts":[
{
"name":"Supreme®/Comme des Garçons SHIRT® Eyes Rayon Shirt",
"id":302426,
"image_url":"//d17ol771963kd3.cloudfront.net/132067/ca/9O934PRlIcw.jpg",
"image_url_hi":"//d17ol771963kd3.cloudfront.net/132067/rc/9O934PRlIcw.jpg",
"price":25800,
"sale_price":0,
"new_item":true,
"position":3,
"category_name":"Shirts",
"price_euro":29800,
"sale_price_euro":0
}
]
}
}
这仅显示了文件的一小部分,整个源位于此处, PasteBin
所以我想做的是转换每个部分(这是一个产品/项目)
{
"name":"Knit Stripe S/S Raglan Top",
"id":302418,
"image_url":"//d17ol771963kd3.cloudfront.net/129807/ca/_9UoFPZi8Zs.jpg",
"image_url_hi":"//d17ol771963kd3.cloudfront.net/129807/rc/_9UoFPZi8Zs.jpg",
"price":9900,
"sale_price":0,
"new_item":true,
"position":10,
"category_name":"Tops/Sweaters",
"price_euro":11600,
"sale_price_euro":0
}
到我的自定义数据类型产品
public Product(string id_p, string name_p, string image_url_p, string category_name_p)
{
id = id_p;
name = name_p;
image_url = image_url_p;
category_name = category_name_p;
}
然后在那之后,我尝试将这些值中的每一个与程序用户分配的值进行比较
List<Product> products = JsonConvert.DeserializeObject<List<Product>>(JsonString);
if (products == null) return null;
foreach (var product in products)
{
// ownerform.Log(product.name, 0);
if (product.category_name == T.item.Category && product.name.ToLower().Contains(T.item.Keyword.ToLower()))
{
ownerform.Log(string.Format("Resolved Keyword! Item : {0}", product.name), T.TID);
return new GetUrlResponse(true, product);
}
}
我现在正在做的事情行不通,而且我真的找不到做什么。
在C#中使用JSON的一种好方法是使用JSON.NET
您可以从JSON.NET中找到API文档 -官方网站可帮助您使用它。
这是将整个JSON文件转换为自定义数据类型的示例……例如:用户,这只是一个简单的示例,可让您更好地了解解决方案。
{“ user”:{“ name”:“ asdf”,“ teamname”:“ b”,“ email”:“ c”}}
所以C#看起来像:
public class User
{
public User(string json)
{
JObject jObject = JObject.Parse(json);
JToken jUser = jObject["user"];
name = (string) jUser["name"];
teamname = (string) jUser["teamname"];
email = (string) jUser["email"];
}
public string name { get; set; }
public string teamname { get; set; }
public string email { get; set; }
}
// Use
private void Run()
{
string json = @"{""user"":{""name"":""asdf"",""teamname"":""b"",""email"":""c""}";
User user = new User(json);
Console.WriteLine("Name : " + user.name);
Console.WriteLine("Teamname : " + user.teamname);
Console.WriteLine("Email : " + user.email);
}
您得到的异常表明您的反序列化有问题。
我无法说出您实际执行的操作,但是如果您尝试反序列化整个json对象(即整个文件),则应了解它不包含Products列表,而是包含更复杂的类型的层次结构。 因此,此行失败:
List<Product> products = JsonConvert.DeserializeObject<List<Product>>(JsonString);
我将列出两种选择,以使您的工作更轻松,并选择自己喜欢的任何方式。
请注意,我将使用更简洁的json对象。 此外,我还向每个数组添加了另一个对象,以使事情更真实(如文件中所示):
{
"unique_image_url_prefixes": [],
"products_and_categories": {
"Tops": [
{
"name": "Top1",
"id": "1"
},
{
"name": "Top2",
"id": "2"
}
],
"Shirts": [
{
"name": "Shirt1",
"id": "3"
},
{
"name": "Shirt2",
"id": "4"
}
]
}
}
选项1
建立类层次结构
转到链接到的 @CodingYoshi 帖子 ,并使用Visual Studio创建类层次结构。 您将在以下层次结构中获得非常相似的内容,尽管我会使其更加简洁:
public class Rootobject
{
public object[] unique_image_url_prefixes { get; set; }
public Products_And_Categories products_and_categories { get; set; }
}
public class Products_And_Categories
{
public TopsSweaters[] TopsSweaters { get; set; }
public Shirts[] Shirts { get; set; }
}
public class TopsSweaters
{
public string name { get; set; }
public int id { get; set; }
}
public class Shirts
{
public string name { get; set; }
public int id { get; set; }
}
反序列化
这是您反序列化字符串的方式:
string JsonString = @"{""unique_image_url_prefixes"":[],""products_and_categories"":{""TopsSweaters"":[{""name"":""Top1"",""id"":""1""},{""name"":""Top2"",""id"":""2""}],""Shirts"":[{""name"":""Shirt1"",""id"":""3""},{""name"":""Shirt2"",""id"":""4""}]}}";
Rootobject container = JsonConvert.DeserializeObject<Rootobject>(JsonString);
然后可以将每个阵列(迭代TopsSweaters
, Shirts
内) container.products_and_categories
。
选项#2
如果您想使用其他一些类层次结构(例如您的Product
类),则可以执行以下操作:
建立类层次结构
public class Product
{
[JsonProperty("name")]
public string name { get; set; }
[JsonProperty("id")]
public int id { get; set; }
}
// Choose either one of the following (they function the same):
public class ProductsContainer1
{
[JsonProperty("TopsSweaters")]
public List<Product> ProductsList1 { get; set;}
[JsonProperty("Shirts")]
public List<Product> ProductsList2 { get; set;}
}
public class ProductsContainer2
{
public List<Product> TopsSweaters { get; set; }
public List<Product> Shirts { get; set; }
}
// Choose either one of the following (they function the same):
public class Things1
{
[JsonProperty("unique_image_url_prefixes")]
public object[] Prefixes { get; set;}
[JsonProperty("products_and_categories")]
public ProductsContainer1 Products { get; set;}
}
public class Things2
{
public object[] unique_image_url_prefixes { get; set;}
public ProductsContainer2 products_and_categories { get; set;}
}
反序列化
反序列化如下:
string JsonString = @"{""unique_image_url_prefixes"":[],""products_and_categories"":{""TopsSweaters"":[{""name"":""Top1"",""id"":""1""},{""name"":""Top2"",""id"":""2""}],""Shirts"":[{""name"":""Shirt1"",""id"":""3""},{""name"":""Shirt2"",""id"":""4""}]}}";
// Use either one of the following:
Things1 container1 = JsonConvert.DeserializeObject<Things1>(JsonString);
Things2 container2 = JsonConvert.DeserializeObject<Things2>(JsonString);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.