C# 正在将JSON结构解析为对象,但该结构可能包含不同的名称

C# 正在将JSON结构解析为对象,但该结构可能包含不同的名称,c#,json,C#,Json,我需要能够访问每个配送服务的代码和标题属性,但它们所包含的对象每次的名称都不同,我无法控制这一点 您可以使用Json.net将Json反序列化为动态变量,以解决(未知属性)问题,并在知道属性的情况下按名称访问属性 例如: dynamic parsedObject = JsonConvert.DeserializeObject("{\"id\":\"123\"}"); parsedObject.id // it should read 123 您可以使用Json.net将Json反序列化为动态变

我需要能够访问每个配送服务的代码和标题属性,但它们所包含的对象每次的名称都不同,我无法控制这一点


您可以使用
Json.net
将Json反序列化为
动态
变量,以解决(未知属性)问题,并在知道属性的情况下按名称访问属性

例如:

dynamic parsedObject = JsonConvert.DeserializeObject("{\"id\":\"123\"}");
parsedObject.id // it should read 123

您可以使用
Json.net
将Json反序列化为
动态
变量,以解决(未知属性)问题,并按名称访问您的属性(假设您知道这些属性)

例如:

dynamic parsedObject = JsonConvert.DeserializeObject("{\"id\":\"123\"}");
parsedObject.id // it should read 123

您可以使用
Newtonsoft.JSON
nuget包将JSON对象直接解析到模型

var objData = JsonConvert.DeserializeObject<MyData>(jsonString);

您可以使用
Newtonsoft.JSON
nuget包将JSON对象直接解析到模型

var objData = JsonConvert.DeserializeObject<MyData>(jsonString);

下面的代码与json.net一起使用

///Custom converter to parse the container.
public class ItemConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jobj = JObject.Load(reader);

        var item = jobj.First.First.ToObject<Item>();
        var container = new ItemContainer
        {
            Name = jobj.First.Path,
            Data = item
        };
        return container;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (Item);
    }
}

[JsonConverter(typeof(ItemConverter))]
public class ItemContainer
{
    public string Name { get; set; }

    //Your object is here
    public Item Data { get; set; }
}

public class Item
{
    public string code { get; set; }
    //Other properties
}

public class RootObj
{
    public ItemContainer[] ShippingMethods { get; set; }
}
///用于分析容器的自定义转换器。
公共类ItemConverter:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var jobj=JObject.Load(读卡器);
var item=jobj.First.First.ToObject();
var container=newitemcontainer
{
Name=jobj.First.Path,
数据=项目
};
返回容器;
}
公共覆盖布尔CanConvert(类型objectType)
{
return objectType==typeof(项目);
}
}
[JsonConverter(类型(ItemConverter))]
公共类ItemContainer
{
公共字符串名称{get;set;}
//你的目标在这里
公共项数据{get;set;}
}
公共类项目
{
公共字符串代码{get;set;}
//其他属性
}
公共类RootObj
{
公共ItemContainer[]ShippingMethods{get;set;}
}
反序列化json:

JsonConvert.DeserializeObject<RootObj>("Your json string");
JsonConvert.DeserializeObject(“您的json字符串”);

下面的代码与json.net一起使用

///Custom converter to parse the container.
public class ItemConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jobj = JObject.Load(reader);

        var item = jobj.First.First.ToObject<Item>();
        var container = new ItemContainer
        {
            Name = jobj.First.Path,
            Data = item
        };
        return container;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (Item);
    }
}

[JsonConverter(typeof(ItemConverter))]
public class ItemContainer
{
    public string Name { get; set; }

    //Your object is here
    public Item Data { get; set; }
}

public class Item
{
    public string code { get; set; }
    //Other properties
}

public class RootObj
{
    public ItemContainer[] ShippingMethods { get; set; }
}
///用于分析容器的自定义转换器。
公共类ItemConverter:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var jobj=JObject.Load(读卡器);
var item=jobj.First.First.ToObject();
var container=newitemcontainer
{
Name=jobj.First.Path,
数据=项目
};
返回容器;
}
公共覆盖布尔CanConvert(类型objectType)
{
return objectType==typeof(项目);
}
}
[JsonConverter(类型(ItemConverter))]
公共类ItemContainer
{
公共字符串名称{get;set;}
//你的目标在这里
公共项数据{get;set;}
}
公共类项目
{
公共字符串代码{get;set;}
//其他属性
}
公共类RootObj
{
公共ItemContainer[]ShippingMethods{get;set;}
}
反序列化json:

JsonConvert.DeserializeObject<RootObj>("Your json string");
JsonConvert.DeserializeObject(“您的json字符串”);


希望这可能会有所帮助希望这可能会有所帮助我已经在使用JsonConvert对其他json文件进行反序列化,但在本例中无法实现,因为我不知道类名是什么。例如,“Flat”、“parcelforce_48”、“free”等名称是我无法控制的。他们可以叫任何名字。因此,我无法创建表示其数据的C#类。您能在运行时生成这些类吗?不能在运行时生成,但您必须了解您的实体,否则如何从中获取数据。如果使用
dynamic
,则还需要知道要从中访问值的属性的名称。我已经在使用JsonConvert对其他json文件进行反序列化,但在本例中无法实现,因为我不知道类名是什么。例如,“Flat”、“parcelforce_48”、“free”等名称是我无法控制的。他们可以叫任何名字。因此,我无法创建表示其数据的C#类。您能在运行时生成这些类吗?不能在运行时生成,但您必须了解您的实体,否则如何从中获取数据。如果您使用
dynamic
,那么您还需要知道要从中访问值的属性的名称。我不认为我在跟踪您。在我给出的示例中,如何访问对象平面的title属性.parsedObject.ShippingMethods[0]。titleDoesn似乎不起作用,尝试访问该属性时,我的值为NULL<代码>动态parsedObject=JsonConvert.DeserializeObject(response.Result);var test=parsedObject.ShippingMethods[0]。标题
动态parsedObject=JsonConvert.DeserializeObject(response.Result);var test=parsedObject.ShippingMethods[0]。平坦;var something=test.title这个例子有效,但它依赖于我知道“扁平”。我不认为我在跟踪你。在我给出的示例中,如何访问对象平面的title属性.parsedObject.ShippingMethods[0]。titleDoesn似乎不起作用,尝试访问该属性时,我的值为NULL<代码>动态parsedObject=JsonConvert.DeserializeObject(response.Result);var test=parsedObject.ShippingMethods[0]。标题
动态parsedObject=JsonConvert.DeserializeObject(response.Result);var test=parsedObject.ShippingMethods[0]。平坦;var something=test.title这个例子有效,但它依赖于我知道“Flat”。ShippingMethods在这个例子中总是空的。我感觉没有调用
ReadJson
方法,并导致容器中的shipping methods为空。您确定吗?我成功地将json示例反序列化为对象。我犯了一个错误,将方法和类设置为内部。一旦他们成功了,它就会起作用