JSON.NET动态分析(更高效的解决方案)

时间:2014-05-01 07:27:17

标签: .net json winforms parsing json.net

所以我使用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":{}
}

到目前为止我的当前代码...我想在user_id对象下获得results的值。

Dim p1 = JObject.Parse(json)
Dim p2 = JObject.Parse(p1("results").ToString.Replace("[", "").Replace("]", ""))
MsgBox(p2("user_id"))

所以我能够获得user_id的价值,但我不认为这是最有效的方式。{p>还有另一种方法吗?非常感谢:)如果有人已经有代码,C#或VB.NET会这样做,但指南对我来说也没关系,谢谢:)

3 个答案:

答案 0 :(得分:1)

JSON对象的序列化和反序列化是使用json字符串和JSON对象的更好方法。这Json converter最适合此类操作。只需将JSON对象反序列化为C#或VB实例,您就可以访问所有属性。

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

没有必要像你所做的那样使用字符串替换来操纵JSON本身。

最干净的方法是创建一个C#类,其字段与您正在解析和反序列化的JSON相同,如Aaron所述。这使得结果更容易使用。

或者,您可以利用LINQ to JSON或动态来执行与原始答案类似的操作,而无需操纵JSON本身。

LINQ to JSON:http://james.newtonking.com/json/help/index.html?topic=html/LINQtoJSON.htm

动态:http://james.newtonking.com/json/help/index.html?topic=html/QueryJsonDynamic.htm