Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# C-如何将json字符串转换为类_C#_Json - Fatal编程技术网

C# C-如何将json字符串转换为类

C# C-如何将json字符串转换为类,c#,json,C#,Json,如何将json字符串转换为类 这是我的json { "$id": "1", "Result": { "$id": "2", "dateTime": 23821964, "list": [{ "$id": "3", "UserId": 302, "UID": "302_UID", "Title": "شیدکو",

如何将json字符串转换为类

这是我的json

{
    "$id": "1",
    "Result": {
        "$id": "2",
        "dateTime": 23821964,
        "list": [{
            "$id": "3",
            "UserId": 302,
            "UID": "302_UID",
            "Title": "شیدکو",
            "Sender": "شیدکو",
            "Answer": "",
            "Comment": "test 2",
            "ProductTitle": null,
            "CommentId": 77,
            "Logo": "http://example.com/Commercial/User/302/Logo/tmpF0BF.jpg",
            "Date": 24302057,
            "AnswerDate": -2123661683,
            "AnswerEdit": false,
            "CommentEdit": false,
            "ForfeitCount": 0,
            "RewardCount": 0,
            "ThisCountReport": 2,
            "Reported": [{
                "$id": "4",
                "BlockerId": 355,
                "Title": "محتوای غیر اخلاقی",
                "Date": -19527396,
                "ForfeitCount": 0,
                "RewardCount": 0
            }, {
                "$id": "5",
                "BlockerId": 355,
                "Title": "محتوای غیر مرتبط",
                "Date": -19527382,
                "ForfeitCount": 0,
                "RewardCount": 0
            }],
            "Gem": 0
        }, {
            "$id": "6",
            "UserId": 302,
            "UID": "302_UID",
            "Title": "شیدکو",
            "Sender": "شیدکو",
            "Answer": "",
            "Comment": "test 2",
            "ProductTitle": null,
            "CommentId": 77,
            "Logo": "http://example.com/Commercial/User/302/Logo/tmpF0BF.jpg",
            "Date": 24302057,
            "AnswerDate": -2123661683,
            "AnswerEdit": false,
            "CommentEdit": false

        }]

    },
    "StatusCode": "Created",
    "Description": null
}
我做了这些步骤,但什么也没发生

JObject json1 = JObject.Parse(strMyJson);
    _CommentAdmindto flight = Newtonsoft.Json.JsonConvert.DeserializeObject<_CommentAdmindto>(json1.ToString());
    _CommentAdmindto deserializedProduct = JsonConvert.DeserializeObject<_CommentAdmindto>(json);
    _CommentAdmindto deserializedProduct1 = ConvertJsonToClass<_CommentAdmindto>(strMyJson);
    JsonSerializer serializer = new JsonSerializer();
    _CommentAdmindto p = (_CommentAdmindto)serializer.Deserialize(new JTokenReader(strMyJson), typeof(_CommentAdmindto));
下面是我的类和函数:

public static T ConvertJsonToClass<T>( string json)
    {
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        return serializer.Deserialize<T>(json);
    }

}

public class _CommentAdmindto
{
    public long dateTime { get; set; }

    public IQueryable<CommentDtoAdmin> list { get; set; }
}

public class CommentDtoAdmin
{
    public long UserId { get; set; }
    public string UID { get; set; }
    public string Title { get; set; }
    public string Sender { get; set; }
    public string Answer { get; set; }
    public string Comment { get; set; }

    public string ProductTitle { get; set; }
    public long CommentId { get; set; }

    public string Logo { get; set; }
    public long Date { get; set; }

    public long AnswerDate { get; set; }

    public bool AnswerEdit { get; set; }

    public bool CommentEdit { get; set; }
}

我认为您的json字符串没有正确的语法。它看起来像是数组的']'结尾,缺少最后一个'}'


这就是VisualStudio编辑器在删除所有“\”后用字符串生成json文件时告诉我的,您似乎试图以许多不同的方式进行反序列化,但您没有与json真正匹配的完整结构。您缺少表示完整对象的外部类,并且至少Newtonsoft.Json无法反序列化为IQueryable,因此我将其更改为IEnumerable

string strMyJson = "{\"$id\":\"1\",\"Result\":{\"$id\":\"2\",\"dateTime\":23826985,\"list\":[{\"$id\":\"3\",\"UserId\":302,\"UID\":\"302_UID\",\"Title\":\"شیدکو\",\"Sender\":\"شیدکو\",\"Answer\":\"\",\"Comment\":\"test 2\",\"ProductTitle\":null,\"CommentId\":77,\"Logo\":\"http://www.domain.com/Commercial/User/302/Logo/tmpF0BF.jpg\",\"Date\":24307078,\"AnswerDate\":-2123656662,\"AnswerEdit\":false,\"CommentEdit\":false,\"ForfeitCount\":0,\"RewardCount\":0,\"ThisCountReport\":2,\"Reported\":[{\"$id\":\"4\",\"BlockerId\":355,\"Title\":\"محتوای غیر اخلاقی\",\"Date\":-19527396,\"ForfeitCount\":0,\"RewardCount\":0},{\"$id\":\"5\",\"BlockerId\":355,\"Title\":\"محتوای غیر مرتبط\",\"Date\":-19527382,\"ForfeitCount\":0,\"RewardCount\":0}],\"Gem\":0},{\"$id\":\"6\",\"UserId\":302,\"UID\":\"302_UID\",\"Title\":\"شیدکو\",\"Sender\":\"شیدکو\",\"Answer\":\"\",\"Comment\":\"test 2\",\"ProductTitle\":null,\"CommentId\":77,\"Logo\":\"http://www.domain.com/Commercial/User/302/Logo/tmpF0BF.jpg\",\"Date\":24307078,\"AnswerDate\":-2123656662,\"AnswerEdit\":false,\"CommentEdit\":false}],\"StatusCode\":\"Created\",\"Description\":null}}";


var result = JsonConvert.DeserializeObject<Wrapper>(strMyJson);
类的外观如下所示:

public class Wrapper
{
    public _CommentAdmindto Result { get; set; }
}
public class _CommentAdmindto
{
    public long dateTime { get; set; }

    public IEnumerable<CommentDtoAdmin> list { get; set; }
}
CommentDtoAdmin看起来是一样的。
尽管我必须说这只对反序列化有帮助。

对于无效的c名称,您的模型应该类似于此,但您可以使用JsonProperty属性:

public class Reported
{
    [JsonProperty("$id")]
    public string id { get; set; }
    public int BlockerId { get; set; }
    public string Title { get; set; }
    public int Date { get; set; }
    public int ForfeitCount { get; set; }
    public int RewardCount { get; set; }
}

public class List
{
    [JsonProperty("$id")]
    public string id { get; set; }
    public int UserId { get; set; }
    public string UID { get; set; }
    public string Title { get; set; }
    public string Sender { get; set; }
    public string Answer { get; set; }
    public string Comment { get; set; }
    public object ProductTitle { get; set; }
    public int CommentId { get; set; }
    public string Logo { get; set; }
    public int Date { get; set; }
    public int AnswerDate { get; set; }
    public bool AnswerEdit { get; set; }
    public bool CommentEdit { get; set; }
    public int ForfeitCount { get; set; }
    public int RewardCount { get; set; }
    public int ThisCountReport { get; set; }
    public List<Reported> Reported { get; set; }
    public int Gem { get; set; }
}

public class Result
{
    [JsonProperty("$id")]
    public string id { get; set; }
    public int dateTime { get; set; }
    public List<List> list { get; set; }
}

public class RootObject
{
    [JsonProperty("$id")]
    public string id { get; set; }
    public Result Result { get; set; }
    public string StatusCode { get; set; }
    public object Description { get; set; }
}
现在可以反序列化为

var result = JsonConvert.DeserializeObject<RootObject>(jsonstring);
顺便说一句:在使用json时,可以帮助猜测您的模型。

首先,$id属性是json.NET添加的合成属性,用于跟踪和保留对同一对象的多个引用。有关详细信息,请参阅

因此,如果临时删除$id属性,则可以将JSON上载到并获取以下数据模型:

public class Reported
{
    public int BlockerId { get; set; }
    public string Title { get; set; }
    public int Date { get; set; }
    public int ForfeitCount { get; set; }
    public int RewardCount { get; set; }
}

public class CommentDtoAdmin
{
    public int UserId { get; set; }
    public string UID { get; set; }
    public string Title { get; set; }
    public string Sender { get; set; }
    public string Answer { get; set; }
    public string Comment { get; set; }
    public object ProductTitle { get; set; }
    public int CommentId { get; set; }
    public string Logo { get; set; }
    public int Date { get; set; }
    public int AnswerDate { get; set; }
    public bool AnswerEdit { get; set; }
    public bool CommentEdit { get; set; }
    public int ForfeitCount { get; set; }
    public int RewardCount { get; set; }
    public int ThisCountReport { get; set; }
    public List<Reported> Reported { get; set; }
    public int Gem { get; set; }
}

public class Result
{
    public int dateTime { get; set; }
    public List<CommentDtoAdmin> list { get; set; }
}

public class RootObject
{
    public Result Result { get; set; }
    public string StatusCode { get; set; }
    public string Description { get; set; }
}
请注意,Json.NET没有将接口IQueryable反序列化为具体类型的内置逻辑,因此我不得不将属性保留为public List{get;set;}。您始终可以使用以下命令从列表生成可查询项:


示例。

这不是答案-如果问题有问题,你应该在注释中注明。我编辑它,json现在可以正常工作,但我无法理解我的问题。我想这是一个重复的问题@Hussaintatel在你的链接上,他们没有将其添加到类中,请查看你的json与你的模型不匹配谢谢,这确实更好,但我现在遇到了另一个错误,正在处理新的错误。System.Web.Extensions.dll中发生了类型为“System.ArgumentException”的异常,但未在用户代码中处理其他信息:类型为“System.Collections.Generic.List1[AdminApp.\u CommentReported]”的对象无法转换为类型为“System.Linq.IQueryable1”[AdminApp._CommentReported]”。如果您使用的是Visual Studio 2015,它具有内置的JSON到类功能。只需打开一个新的空类文件并编辑>粘贴特殊>JSON作为类。也适用于XML。并不总是完美的,但非常好。在这种情况下,它唯一缺少的是ID变量上的属性装饰。
var settings = new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
};
var root = JsonConvert.DeserializeObject<RootObject>(json1, settings);

var json2 = JsonConvert.SerializeObject(root, Formatting.Indented, settings);
var queryable = root.Result.list.AsQueryable();