Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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
C# Json对象反序列化到c模型_C#_Json - Fatal编程技术网

C# Json对象反序列化到c模型

C# Json对象反序列化到c模型,c#,json,C#,Json,我有一个来自第三方Web服务的json返回,格式如下。我不担心它对某个对象的反序列化。我的模型结构应该是什么 {"123":{"Name":"test1","Address":"add 1"} ,"1412":{"Name":"test2","Address":"add 2"} ,"4123":{"Name":"test3","Address":"add 3"}} 我是用这个工具得到的。您会注意到,C类型不能以数字开头,因此它们前面的类型无效。但是你可以随意给它们重命名。这应该让你开始了解结构

我有一个来自第三方Web服务的json返回,格式如下。我不担心它对某个对象的反序列化。我的模型结构应该是什么

{"123":{"Name":"test1","Address":"add 1"}
,"1412":{"Name":"test2","Address":"add 2"}
,"4123":{"Name":"test3","Address":"add 3"}}
我是用这个工具得到的。您会注意到,C类型不能以数字开头,因此它们前面的类型无效。但是你可以随意给它们重命名。这应该让你开始了解结构


我知道您无法控制JSON,但它的格式选择似乎很糟糕。您有三种基本相同的类型。他们应该使用一个数组。那就简单多了。

Thanx@mason你给我一个线索让我找到。我终于找到了解决办法。。我想我也应该和你们分享

我的问题的答案是:

var jobj = (JObject)JsonConvert.DeserializeObject(json);
var items = jobj.Children()
    .Cast<JProperty>()
    .Select(j=>new
    {
        Id=j.Name,
        Name= (string)j.Value["Name"],
        Address= (string)j.Value["Address"]            
    })
    .ToList();
使用该工具,您可以简单地:

public class NameAddress
{
    public string Name { get; set; }
    public string Address { get; set; }
}

public class RootObject
{
    [JsonProperty("123")]
    public NameAddress { get; set; }
    [JsonProperty("1412")]
    public NameAddress { get; set; }
    [JsonProperty("4123")]
    public NameAddress { get; set; }
}

我知道这是老生常谈,但对于那些寻找答案的人,我有一个解决办法。使用Json.Net,我将结构反序列化为一个带有字符串键和对象值的字典,从而破解了这个难题。解决方案如下:

public class Item {
    public string Name { get; set; }
    public string Address { get; set; }
}

Dictionary<string, Item> itemList = 
    JsonConvert.DeserializeObject<Dictionary<string, Item>>( myJsonString );

我验证了上面的代码在您的示例中有效。如果不能保证生成的字典中的项名称或键不是唯一的,则可能可以使用Json.Net支持的另一种类型的集合。

我将从一个类开始,如:public class ContactData{int id;string name;string address;}请查看。我也有类似的问题。这个解决方案对我来说非常有效。@spots这应该是答案。@MareInfinitus请解释,说它不正确并不能告诉我它有什么不正确的地方。根据我在问题中读到的内容,OP正在寻找一种生成对象图的方法。为三个格式相同的json对象提供三种类型。这似乎不是OP想要的,至少对我来说是这样。OP问他反序列化对象的结构应该是什么。我提供了如何反序列化它的一对一示例。我指出,这三种相同的类型是由于提供的JSON的结构。提供者似乎打算将它们作为单独的类型,否则将使用一个数组。虽然这看起来可行,但您应该看看Erik的答案,因为它为您提供了一个可以重用的良好对象,并且反序列化只需要一行代码。Json.NET是一个很棒的库。
public class Item {
    public string Name { get; set; }
    public string Address { get; set; }
}

Dictionary<string, Item> itemList = 
    JsonConvert.DeserializeObject<Dictionary<string, Item>>( myJsonString );