18

我有如下的 Json 字符串

 {
"JsonValues":{

        "id": "MyID",

         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}

我想将 Json 字符串转换为以下类

  class ValueSet
   {
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    [JsonProperty("values")]
    public List<Value> values
    {
        get;
        set;
    }
  }

class Value
{
    public string id
    {
        get;
        set;
    }
    public string DiaplayName
    {
        get;
        set;
    }
}

我的反序列化代码是

JavaScriptSerializer js = new JavaScriptSerializer();
        StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
        string jsonString = sr.ReadToEnd();
        var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

但是序列化后我得到空值,我该如何解决这个问题?

4

9 回答 9

20

正如其他人已经指出的那样,您没有得到预期结果的原因是您的 JSON 与您尝试反序列化的类结构不匹配。您要么需要更改 JSON,要么更改您的类。由于其他人已经展示了如何更改 JSON,我将在此处采用相反的方法。

为了匹配您在问题中发布的 JSON,您的类应定义如下。请注意,我进行了以下更改:

  1. Wrapper在你的 JSON 中添加了一个对应于外部对象的类。
  2. 我将类的Values属性ValueSet从 a更改List<Value>为 a,Dictionary<string, Value>因为valuesJSON 中的属性包含一个对象,而不是数组。
  3. 我添加了一些额外[JsonProperty]的属性来匹配 JSON 对象中的属性名称。

类定义:

class Wrapper
{
    [JsonProperty("JsonValues")]
    public ValueSet ValueSet { get; set; }
}

class ValueSet
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("values")]
    public Dictionary<string, Value> Values { get; set; }
}

class Value
{
    [JsonProperty("id")]
    public string Id { get; set; }
    [JsonProperty("diaplayName")]
    public string DisplayName { get; set; }
}

您需要反序列化到Wrapper类中,而不是ValueSet类中。然后,您可以ValueSetWrapper.

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

这是一个工作程序来演示:

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"
        {
            ""JsonValues"": {
                ""id"": ""MyID"",
                ""values"": {
                    ""value1"": {
                        ""id"": ""100"",
                        ""diaplayName"": ""MyValue1""
                    },
                    ""value2"": {
                        ""id"": ""200"",
                        ""diaplayName"": ""MyValue2""
                    }
                }
            }
        }";

        var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;

        Console.WriteLine("id: " + valueSet.Id);
        foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
        {
            Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
            Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
        }
    }
}

这是输出:

id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
于 2013-10-25T15:28:19.187 回答
11

http://json2csharp.com/

我发现上面的链接非常有用,因为它通过从实际返回的 JSON 生成它们来纠正我的 C# 类。

然后我打电话给:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

一切都按预期工作。

于 2016-02-04T18:36:36.843 回答
5

您是否检查过这条线完美无缺并且您的字符串在其中有价值?

string jsonString = sr.ReadToEnd();

如果是,请在最后一行尝试此代码:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

或者如果你有一个 json 数组,你可以使用这样的列表:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

祝你好运

于 2013-10-25T07:41:22.633 回答
2

您的数据结构和 JSON 不匹配。

你的 JSON 是这样的:

{
    "JsonValues":{
        "id": "MyID",
        ...
    }
}

但是您尝试将其序列化为的数据结构是这样的:

class ValueSet
{
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    ...
}

您正在跳过一个步骤:您的 JSON 是一个具有一个名为 的属性的类,该属性JsonValues具有您的数据结构的一个对象ValueSet作为值。

同样在您的班级中,您的 JSON 是这样的:

"values": { ... }

你的数据结构是这样的:

[JsonProperty("values")]
public List<Value> values
{
    get;
    set;
}

请注意,{ .. }在 JSON 中定义了一个对象,而 as[ .. ]定义了一个数组。因此,根据您的 JSON,您没有一堆值,但是您有one带有 propertiesvalue1value2type的 values 对象Value

由于反序列化器需要一个数组但获取的是一个对象,因此它会做它可以做的最不具破坏性(异常)的事情:跳过该值。您的属性values保持其默认值:null

如果可以:调整您的 JSON。以下内容将与您的数据结构匹配,并且很可能是您真正想要的:

{
    "id": "MyID",

     "values": [
         {
            "id": "100",
            "diaplayName": "MyValue1"
         }, {
            "id": "200",
            "diaplayName": "MyValue2"
         }
     ]
}
于 2013-10-25T06:11:46.790 回答
1

Json 转换为 C# 类 = https://json2csharp.com/json-to-csharp

架构出来后

        WebClient client = new WebClient();

        client.Encoding = Encoding.UTF8;

        string myJSON = client.DownloadString("http://xxx/xx/xx.json");

        var valueSet = JsonConvert.DeserializeObject<Root>(myJSON);

我们最大的错误是我们无法将类结构与json匹配。

此连接将自动完成该过程。您稍后将对其进行编码;) = https://json2csharp.com/json-to-csharp

而已。

于 2020-12-11T09:05:16.580 回答
0

你有一个不匹配的 json 字符串,如果你想转换成一个列表,试试这个

{
    "id": "MyID",

     "values": [
        {
            "id": "100",
            "diaplayName": "MyValue1",
        },
        {
            "id": "200",
            "diaplayName": "MyValue2",
        }
   ]    
}
于 2013-10-25T06:11:09.333 回答
0

这也是可能的:

using System.Web.Helpers;
var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);
于 2015-07-15T18:00:09.333 回答
0

这需要 JsonElement 并将其反序列化为对象列表。

List<object> draftInvoices = JsonConvert.DeserializeObject<List<object>>(jsonDrafts.ToString());

例子:

[HttpPost]
        [Route("CreateDraft")]
        public async Task<IActionResult> CreateDraft([FromBody] JsonElement jsonDrafts)
        {
            List<object> draftInvoices = JsonConvert.DeserializeObject<List<object>>(jsonDrafts.ToString());
             
          
                for (int i = 0; i < draftInvoices.Count; i++) 
                 {
                  ........
                 }  
于 2021-09-13T07:43:44.523 回答
-4

您可以使用 Json.Net 框架来执行此操作。像这样 :

Account account = JsonConvert.DeserializeObject<Account>(json);

主页:http: //json.codeplex.com/

关于这个的文件:http: //james.newtonking.com/json/help/index.html#

于 2013-10-25T06:30:54.590 回答