反过来将嵌套的JSON反序列化为类/对象 - 将其序列化为字符串

时间:2017-08-15 19:06:43

标签: c# json json.net

这是我的目标,我想从源中检索JSON数据,反序列化为对象,根据值过滤掉对象,最后将其序列化为JSON字符串格式。这是(一个例子)我对JSON数据的看法:

[  
   {  
      "property":"prop1",
      "status" : {
         status1: "A",
         status2: -1,
         status3: "Success", 
      },
      "offlist":[  
         {  
            "description":"description blah",
            "type":"F",
            "values":{  
               "value1":30.0,
               "value2":0.0
            }
         },
         {  
            "description":"description blah",
            "type":"F",
            "values":{  
               "value1":30.0,
               "value2":0.0
            }
         }
      ]
   },
   {  
      "property":"prop2",
      "status" : {
         status1: "A",
         status2: -1,
         status3: "Success", 
      },
      "offlist":[  
         {  
            "description":"description blah",
            "type":"Q",
            "values":{  
               "value1":30.0,
               "value2":0.0
            }
         }
      ]
   }
]

这是我的课程:

public class offerModel {
    public List<offlist> offlist { get; set; }
    public status statuses { get; set; }
    public string property{ get; set; }
}
public class offlist{
    public string description{ get; set; }
    public string type{ get; set; }
    public values values { get; set; }        
}
public class values{
    public double value1 { get; set; }
    public double value2{ get; set; }
}

public class statuses {
    public string status1 { get; set; }
    public double status2 { get; set; }
    public string status3 { get; set; }

}
public class RootObj {
    public List<offerModel> offModels { get; set; }
}

尝试反序列化为对象时,我得到一个包含5个对象的List(这是预期的),但所有这些对象都为null。见下文:

var obj = JsonConvert.DeserializeObject<List<RootObj>>(jsonstring);

然后我要删除所有“offlist”对象,其中'type'值等于'F'。

删除后,我想重新使用JSON字符串格式,我相信它与下面非常类似,我只是无法以正确的方式反序列化。

var json = JsonConvert.SerializeObject(obj);

如果我遗漏任何细节,请告诉我......

2 个答案:

答案 0 :(得分:1)

将嵌套的 JSON 反序列化为 Class。不是基于字典,但很有用。

步骤 01:打开链接 https://jsonformatter.org/json-parser

步骤 02:复制您的 json 文件或内容。

步骤 03:打开上面的链接。复制内容并粘贴到左侧,然后单击“JSON 解析器”按钮。

步骤 04:点击下载按钮。下载 jsonformatter.txt 文件。成功下载文件为 jsonformatter.txt。

第 05 步:复制第 02 步的内容并打开网址 https://json2csharp.com/。复制内容并粘贴到左侧,然后点击“转换”按钮。

步骤 06:在脚本中。

(A) 创建 myRootClass.cs 文件并将内容复制并粘贴到您的文件中。[[System.Serializable] 它用于统一 3d 软件 c# 脚本]

[System.Serializable]
public class myRootClass
{
    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
   [System.Serializable]
    public class Status
   {
    public string status1 { get; set; }
    public int status2 { get; set; }
    public string status3 { get; set; }
   }
   [System.Serializable]
   public class Values
   {
    public double value1 { get; set; }
    public double value2 { get; set; }
   }
   [System.Serializable]
   public class Offlist
   {
    public string description { get; set; }
    public string type { get; set; }
    public Values values { get; set; }
   }

   public class Root
  {
    public string property { get; set; }
    public Status status { get; set; }
    public List<Offlist> offlist { get; set; }
   }
}

    

(B) 读取 jsonformatter.txt 文件。

// Read entire text file content in one string 
    string  textFilePath = "C:/Users/XXX/Downloads/jsonformatter.txt";//change path
    string jsontext = System.IO.File.ReadAllText(textFilePath);  
    Debug.Log("Read Json"+jsontext);// used Console.Writeline

(C) 将字符串转换为 C# 并显示数据。

  Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(jsontext); 
  
  Debug.Log("myDeserializedClass.property:- "+myDeserializedClass.property); //used Console.Writeline
 var offlists= myDeserializedClass.offlist; // used foreach and view data

答案 1 :(得分:0)

将序列化更改为JsonConvert.DeserializeObject<List<offerModel>>(data) 并将offerModel类属性statuses修复为public statuses status { get; set; },以使您的示例可反序列化 如果你想保留一个根对象,你可以做下一步:

public class RootObj : List<offerModel>{}
JsonConvert.DeserializeObject<RootObj>(data)