Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此JSON文件转换为自定义c#对象_C#_Json - Fatal编程技术网

如何将此JSON文件转换为自定义c#对象

如何将此JSON文件转换为自定义c#对象,c#,json,C#,Json,我正在尝试创建一种方法,将整个json文件转换为我的自定义数据类型,称为产品 { "unique_image_url_prefixes":[ ], "products_and_categories":{ "Tops/Sweaters":[ { "name":"Knit Stripe S/S Raglan Top", "id":302418, "image_url":"//d17ol771963kd3.c

我正在尝试创建一种方法,将整个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
     }
     ]
  }
}
这只显示了文件的几个部分整个源代码都在这里

所以我要做的是转换这个的每个部分(它是一个产品/项目)

到名为Product的自定义数据类型

    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);
          }

      }
List products=JsonConvert.DeserializeObject(JsonString);
如果(products==null)返回null;
foreach(产品中的var产品)
{
//ownerform.Log(product.name,0);
如果(product.category_name==T.item.category&&product.name.ToLower()。包含(T.item.Keyword.ToLower())
{
Log(string.Format(“已解析关键字!项:{0}”,product.name),T.TID);
返回新的GetUrlResponse(true,product);
}
}

我现在所做的不起作用,我真的找不到什么起作用。

在C#中使用JSON的一个好方法是

您可以找到-官方网站帮助您使用它

这是一个将整个JSON文件转换为自定义数据类型的示例。。。 例如:用户 这只是一个简单的示例,您可以更好地理解解决方案

{ “用户”:{ “名称”:“asdf”, “团队名称”:“b”, “电子邮件”:“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对象(即整个文件),您应该了解它不包含产品列表,而是包含更复杂的类型层次结构。因此,该行失败:

List<Product> products = JsonConvert.DeserializeObject<List<Product>>(JsonString);
选项#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);
反序列化

按如下方式反序列化:

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);
string JsonString=@“{”唯一图像url前缀“:[],“产品和类别“:{”顶级毛衣“:[{”名称“:”Top1“,”id“:”1“},{”名称“:”Top2“,”id“:”2“}],”衬衫“:[{”名称“:”衬衫1“,”id“:”3“},{”名称“:”衬衫2“,”衬衫“:”衬衫“:”衬衫“:”3“},{”名称“:”衬衫2“:”id“:”4“}”;
//使用以下任一选项:
Things1 container1=JsonConvert.DeserializeObject(JsonString);
Things2 container2=JsonConvert.DeserializeObject(JsonString);

那么什么不起作用呢?你怎么知道它不起作用?错误消息可能会有所帮助。可能需要完全反序列化对象的副本,假设您的产品对象已被消费或包装到其他对象中以反序列化整个对象?我尝试反序列化到的对象是“产品”类型,它没有所有的价值,只有我需要的我知道怎么做,但我想让它检查所有不同的产品,我该怎么做?哦,我明白了。。你可以用代币之类的东西。。这只是一个建议。。。我认为你不仔细看是不可能得到它的。
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);
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);