所以我使用JSON。. NET解析JSON数据。我有使用JObject
类的动态解析工作,但我正在寻找一个更有效的方法。这只是基本的,我的最终解决方案会复杂得多,但首先,我需要掌握基本知识。
JSON数据。
{
"count":1,
"results": [{
"user_id":5029420,
"login_name":"EtsyStore",
"creation_tsz":1282269739,
"referred_by_user_id":null,
"feedback_info": {
"count":3038,
"score":100
}
}],
"params": {
"user_id":"etsystore"
},
"type":"User",
"pagination":{}
}
这是我目前为止的代码…我想要得到results
对象下user_id
的值
Dim p1 = JObject.Parse(json)
Dim p2 = JObject.Parse(p1("results").ToString.Replace("[", "").Replace("]", ""))
MsgBox(p2("user_id"))
所以我能够得到user_id
的值,但我不认为这是最有效的方法。还有别的方法吗?非常感谢:)如果有人已经有代码,c#或VB。. NET就可以了,但是指导方针对我来说会很好,谢谢:)
使用JSON解析器时,不需要直接操作JSON字符串(这是解析器的工作),也不需要多次解析JSON(第一次解析时数据已经在内存中)。所以你是对的,你所做的并不是提取数据的最好方法。
下面是一个如何使用LINQ-to-JSON API(即JObjects/JTokens)从JSON中提取user_id
和其他结果数据的示例。因为results
在JSON中是一个数组,所以我假设可能并不总是只有一个结果,所以我将在这里使用循环。
' load all the JSON data into a JObject
Dim p1 As JObject = JObject.Parse(json)
' loop over the "results" array to get each child object (result)
For Each result As JToken In p1("results").Children()
' extract the data from each result
Dim userId As Integer = result("user_id").Value(Of Integer)()
Dim loginName As String = result("login_name").ToString()
Dim creationTsz As Long = result("creation_tsz").Value(Of Long)()
' the feedback info is one level further down
Dim feedback As JToken = result("feedback_info")
Dim feedbackCount As Integer = feedback("count").Value(Of Integer)()
Dim feedbackScore As Integer = feedback("score").Value(Of Integer)()
' do something with the data; perhaps write it to the console
Console.WriteLine("User ID: " + userId.ToString())
Console.WriteLine("Login Name: " + loginName.ToString())
Console.WriteLine("Creation TSZ: " + creationTsz.ToString())
Console.WriteLine("Feedback Count: " + feedbackCount.ToString())
Console.WriteLine("Feedback Score: " + feedbackScore.ToString())
Console.WriteLine()
Next
JSON对象的序列化和反序列化是使用JSON字符串和JSON对象的更好方法。这个Json转换器最适合这种操作。只需将JSON对象反序列化为c#或VB实例,就可以访问所有属性。
不需要像前面那样使用字符串替换来操作JSON本身。
最干净的方法是创建一个c#类,其字段与您正在解析和反序列化的JSON相同,正如Aaron所提到的。这使得结果更容易使用。
或者你可以利用LINQ to JSON或动态来做类似于你原始答案的事情,而不需要操纵JSON本身。
LINQ toJSON: http://james.newtonking.com/json/help/index.html?topic=html/LINQtoJSON.htm
动力学:http://james.newtonking.com/json/help/index.html?topic=html/QueryJsonDynamic.htm