在C#测试中读取和映射Json文件中的数据

6

我正在尝试在自动化测试中使用JSON文件中的数据。因为我找到了如何处理它的方法,感谢@jeroenh,我在这里留下了正确的方法。我希望它能对某些人有所帮助。

-- JSON文件(testDataCo.Json):

{
  "DataCo": [
    {        
      "url": "https://dodo.com",
      "user": "test@test.com",
      "password": "uawe",       
    }
  ]
}

-- 将数据确定的类转换为 JSON 文件
sing System.Globalization;
using Newtonsoft.Json.Converters;
using System.IO;
using Newtonsoft.Json;

namespace DataFromJson
{ 

    public partial class DataJson
    {
        [JsonProperty("DataCo")]
        public DataCo[] DataCo { get; set; }
    }

    public partial class DataCo
    {       
        [JsonProperty("url")]
        public string Url { get; set; }   

        [JsonProperty("user")]
        public string User { get; set; }

        [JsonProperty("password")]
        public string Password { get; set; }      
    }

    public partial class DataJson
    {
        public static DataJson FromJson(string json) => JsonConvert.DeserializeObject<DataJson>(json, DataFromJson.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this DataJson self) => JsonConvert.SerializeObject(self, DataFromJson.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters = {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }
}

-- 这里你可以使用JSON中的数据作为变量

public class UseJsonInVar
    {
       string filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../testDataCo.json"); 
       StreamReader ddd = new StreamReader(filepath);
       var json = ddd.ReadToEnd();
       DataJson objectJson = JsonConvert.DeserializeObject<DataJson>(json);

       url = objectJson.DataCo[0].Url;
       user = objectJson.DataCo[0].User;
       pass = objectJson.DataCo[0].Password;
    }
3个回答

3
你正在将文件内容读入变量json,但之后你的代码似乎没有对其进行任何操作。虽然创建了一个JsonData实例,但实际的JSON数据从未传递到它。
你需要使用一个库将JSON数据反序列化为对象。你已经在使用Json.NET,这是一个不错的库。有了这个库在你的项目引用中,你可以这样做:
JsonData obj = JsonConvert.DeserializeObject<JsonData>(json);
string plant = obj.plant; // "plant goco"

1
你的类有一个根对象,'Dataco'字段是一个数组。
你可以在Visual Studio中使用“编辑-特殊粘贴-将JSON粘贴为类”功能轻松地将JSON转换为正确的类。另一种可能性是使用在线的json-to-c#转换器,例如https://app.quicktype.io/#l=cs
public partial class RootData
{
    [JsonProperty("DataCo")]
    public DataCo[] DataCo { get; set; }
}

public partial class DataCo
{
    [JsonProperty("discount")]
    public long Discount { get; set; }

    [JsonProperty("quote name")]
    public string QuoteName { get; set; }

    [JsonProperty("base price")]
    public long BasePrice { get; set; }

    [JsonProperty("product description")]
    public string ProductDescription { get; set; }

    [JsonProperty("plant")]
    public string Plant { get; set; }

    [JsonProperty("url")]
    public string Url { get; set; }

    [JsonProperty("final price")]
    public long FinalPrice { get; set; }

    [JsonProperty("password")]
    public string Password { get; set; }

    [JsonProperty("quote id")]
    public string QuoteId { get; set; }

    [JsonProperty("freight")]
    public string Freight { get; set; }

    [JsonProperty("billing price")]
    public long BillingPrice { get; set; }

    [JsonProperty("quantity")]
    public long Quantity { get; set; }

    [JsonProperty("proposed price")]
    public long ProposedPrice { get; set; }

    [JsonProperty("user")]
    public string User { get; set; }

    [JsonProperty("product id")]
    public long ProductId { get; set; }
}

有了这个类,您可以使用Newtonsoft JSON.Net反序列化json文本:

JsonConvert.DeserializeObject<RootData>(json);

我尝试了一下,结果为空。我不明白为什么。DataCo obj = JsonConvert.DeserializeObject(json); string plant = obj.Plant; Console.WriteLine(plant); - martin pb
最后我终于搞定了..感谢调试器的帮助var json = r.ReadToEnd(); DataJson obj = JsonConvert.DeserializeObject(json); var plant = obj.DataCo[0].Plant; Console.WriteLine(plant); - martin pb
非常感谢,我已经更新了代码并在这里留下了正确的方式,希望能帮助到某些人。 - martin pb

0
如果您可以将json文件嵌入到程序中,请考虑使用JsonSectionReader包。
该包提供了出色的支持,可用于使用json数据进行单元测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接