Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# 使用Newtonsoft(或者LINQ到JSON?)将JSON反序列化到.NET对象_C#_Json_Linq_Json.net_Deserialization - Fatal编程技术网

C# 使用Newtonsoft(或者LINQ到JSON?)将JSON反序列化到.NET对象

C# 使用Newtonsoft(或者LINQ到JSON?)将JSON反序列化到.NET对象,c#,json,linq,json.net,deserialization,C#,Json,Linq,Json.net,Deserialization,我知道有几篇关于Newtonsoft的文章,所以希望这不完全是重复……我正在尝试将Kazaa的API返回的JSON数据转换成某种类型的好对象 WebClient client = new WebClient(); Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"); StreamReader reader = new StreamReader(stream

我知道有几篇关于Newtonsoft的文章,所以希望这不完全是重复……我正在尝试将Kazaa的API返回的JSON数据转换成某种类型的好对象

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

List<string> list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(reader.Read().ToString());

foreach (string item in list)
{
    Console.WriteLine(item);
}

//Console.WriteLine(reader.ReadLine());
stream.Close();

我做了更多的阅读,发现Newtonsoft的LINQ to JSON正是我想要的…使用WebClient、Stream、StreamReader和Newtonsoft…我可以点击Kazaa获取JSON数据,提取URL,下载文件,然后像七行代码一样完成这一切!我喜欢它

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album");
StreamReader reader = new StreamReader(stream);

Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());

// Instead of WriteLine, 2 or 3 lines of code here using WebClient to download the file
Console.WriteLine((string)jObject["albums"][0]["cover_image_url"]);
stream.Close();

这篇文章获得了如此多的点击量,我认为将评论中讨论的“使用”部分包括进来可能会有所帮助

using(var client = new WebClient())
using(var stream = client.OpenRead("http://api.kazaa.com/api/v1/search.json?q=muse&type=Album"))
using (var reader = new StreamReader(stream))
{
    var jObject = Newtonsoft.Json.Linq.JObject.Parse(reader.ReadLine());
    Console.WriteLine((string) jObject["albums"][0]["cover_image_url"]);
}

如果您只需要从JSON对象获取一些项目,我将使用JSON.NET的LINQ to JSON
JObject
类。例如:

JToken token = JObject.Parse(stringFullOfJson);

int page = (int)token.SelectToken("page");
int totalPages = (int)token.SelectToken("total_pages");
我喜欢这种方法,因为您不需要完全反序列化JSON对象。这对于API来说很方便,因为API有时会因为缺少对象属性而让您感到惊讶,比如Twitter


文档:如果我弄错了,请纠正我的错误,但我相信前面的示例与James Newton的Json.NET库的最新版本有点不同步

var o = JObject.Parse(stringFullOfJson);
var page = (int)o["page"];
var totalPages = (int)o["total_pages"];
您可以使用C#
动态
类型来简化操作。这种技术也使得重分解更简单,因为它不依赖于魔术字符串

JSON

下面的JSON字符串是HTTP API调用的简单响应,它定义了两个属性:
Id
Name

{"Id": 1, "Name": "biofractal"}
C#

使用
JsonConvert.DeserializeObject()
将此字符串反序列化为动态类型,然后只需以常规方式访问其属性即可

dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
var id = results.Id;
var name= results.Name;
dynamic results=JsonConvert.DeserializeObject(json);
var id=results.id;
var name=results.name;
如果将
results
变量的类型指定为
dynamic
,而不是使用
var
关键字,则属性值将正确反序列化,例如
Id
int
而不是
JValue
(感谢GFoley83提供以下注释)

注意:Newtonsoft程序集的NuGet链接为


软件包:您还可以使用nuget live installer添加软件包,打开项目后,只需执行并安装它,它将被添加到项目的Dependencies/nuget

下,使用
dynamic
关键字,解析这类对象变得非常容易:

dynamic x = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
var page = x.page;
var total_pages = x.total_pages
var albums = x.albums;
foreach(var album in albums)
{
    var albumName = album.name;

    // Access album data;
}

此外,如果您只是寻找嵌套在JSON内容中的特定值,您可以这样做:

yourJObject.GetValue("jsonObjectName").Value<string>("jsonPropertyName");
yourJObject.GetValue(“jsonObjectName”).Value(“jsonPropertyName”);
从那里开始


如果您不想承担将整个JSON转换为C对象的成本,这可能会有所帮助。

动态列表松散类型-反序列化并读取值

// First serializing
dynamic collection = new { stud = stud_datatable }; // The stud_datable is the list or data table
string jsonString = JsonConvert.SerializeObject(collection);


// Second Deserializing
dynamic StudList = JsonConvert.DeserializeObject(jsonString);

var stud = StudList.stud;
foreach (var detail in stud)
{
    var Address = detail["stud_address"]; // Access Address data;
}
我喜欢这个方法:

using Newtonsoft.Json.Linq;
// jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, object> dictObj = jsonObj.ToObject<Dictionary<string, object>>();
使用Newtonsoft.Json.Linq;
//jsonString是JSON格式的字符串
JObject jsonObj=JObject.Parse(jsonString);
Dictionary dictObj=jsonObj.ToObject();
现在,您可以使用
dictObj
作为字典访问任何您想要的内容。如果希望以字符串形式获取值,也可以使用
字典


您可以使用相同的方法强制转换为任何类型的.NET对象。

如果您像我一样喜欢处理强类型对象**请使用:

MyObj obj =  JsonConvert.DeserializeObject<MyObj>(jsonString);
MyObj-obj=JsonConvert.DeserializeObject(jsonString);
这样就可以使用intellisense和编译时类型错误检查

通过将JSON复制到内存中并将其粘贴为JSON对象(Visual Studio->编辑->粘贴特殊->将JSON粘贴为类),可以轻松创建所需的对象

看看在VisualStudio中是否没有该选项

您还需要确保您的JSON是有效的。如果只是一个对象数组,请在开始时添加您自己的对象。i、 e.{“obj”:[{},{},{}]}


**我知道动态有时会让事情变得更简单,但我对此有点不太了解。

终于从JSON获得了状态名

谢谢

Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports System.collections.generic

Public Module Module1
    Public Sub Main()

         Dim url As String = "http://maps.google.com/maps/api/geocode/json&address=attur+salem&sensor=false"
            Dim request As WebRequest = WebRequest.Create(url)
        dim response As WebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
        dim reader As New StreamReader(response.GetResponseStream(), Encoding.UTF8)
          Dim dataString As String = reader.ReadToEnd()

        Dim getResponse As JObject = JObject.Parse(dataString)

        Dim dictObj As Dictionary(Of String, Object) = getResponse.ToObject(Of Dictionary(Of String, Object))()
        'Get State Name
        Console.WriteLine(CStr(dictObj("results")(0)("address_components")(2)("long_name")))
    End Sub
End Module

我为json创建了一个Extionclass:

 public static class JsonExtentions
    {
        public static string SerializeToJson(this object SourceObject) { return Newtonsoft.Json.JsonConvert.SerializeObject(SourceObject); }


        public static T JsonToObject<T>(this string JsonString) { return (T)Newtonsoft.Json.JsonConvert.DeserializeObject<T>(JsonString); }
}

参加这个聚会已经很晚了,但我今天在工作中遇到了这个问题。下面是我如何解决这个问题的

我正在访问第三方API以检索书籍列表。该对象返回了一个包含大约20多个字段的大型JSON对象,其中我只需要ID作为列表字符串对象。我在动态对象上使用linq来检索所需的特定字段,然后将其插入到我的列表字符串对象中

dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();

List<string> codes = new List<string>();

foreach (var code in contentCodes)
{
    codes.Add(code?.ToString());
}
dynamic content=JsonConvert.DeserializeObject(requestContent);
var contentCodes=((IEnumerable)content).Where(p=>p.\u id!=null).选择(p=>p.\u id).ToList();
列表代码=新列表();
foreach(contentCodes中的var代码)
{
codes.Add(code?.ToString());
}

使用JsonConvert.DeserializeObject()函数反序列化

公共类API值
{
[JsonProperty(“地址”)]
公共字符串地址{get;set;}
[JsonProperty(“BaseUrl”)]
公共字符串BaseUrl{get;set;}
}
var json=
{ 
“地址”:“某个地址”,
“BaseUrl”:“某些url值”
}
var values=JsonConvert.DeserializeObject(json);

ya实际上我已经做了更多的阅读和测试…发现这也是一种很好的方法…Newtonsoft,相当不错的库,我将为其他人发布我的示例,提供了一个我是如何做的粗略示例…不太一样,我看到你建议JToken。解析…还不确定两者之间的区别,但耶,好东西@谢谢你!那是个打字错误。JToken是JObject的基类,我个人喜欢使用更抽象的类型。谢谢你提醒我。对不起,应该是JToken还是JObject?上面的代码仍然时不时地抛出错误“从JsonReader读取JObject时出错”
 public class Myobject
    {
        public Myobject(){}
        public string prop1 { get; set; }

        public static Myobject  GetObject(string JsonString){return  JsonExtentions.JsonToObject<Myobject>(JsonString);}
        public  string ToJson(string JsonString){return JsonExtentions.SerializeToJson(this);}
    }
   Myobject dd= Myobject.GetObject(jsonstring);

                 Console.WriteLine(dd.prop1);
dynamic content = JsonConvert.DeserializeObject(requestContent);
var contentCodes = ((IEnumerable<dynamic>)content).Where(p => p._id != null).Select(p=>p._id).ToList();

List<string> codes = new List<string>();

foreach (var code in contentCodes)
{
    codes.Add(code?.ToString());
}