C# VB .NET 解析 JSON

如何在 .NET 程序中解析 JSON

 

使用 Newtonsoft.Json 第三方类来操纵

Newtonsoft.Json 是.NET 下开源的json格式序列号和反序列化的类库

官方网站: http://json.codeplex.com/

 

Imports System.Text.RegularExpressions
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
''' <summary>
''' json序列化
''' </summary>
Public Class json
    ''' <summary>
    ''' 解析JSON数据
    ''' </summary>
    ''' <param name="empData">源数据</param>
    ''' <param name="key">指定值下的数据,可省略。</param>
    ''' <returns>0 非 json 数据</returns>
    Public Shared Function JsonDecode(ByVal empData, Optional ByVal key1 = Nothing, Optional ByVal key2 = Nothing, Optional ByVal arry_i = Nothing) As String
        Try
            If IsJson(empData) = False Then Return 0

            If arry_i IsNot Nothing Then
                'http://blog.csdn.net/goodelephant/article/details/24769421
                Return CType(JsonConvert.DeserializeObject(empData), JObject)(key1)(arry_i)(key2).ToString()   '这个是解析数组  下标。。
            End If


            If key1 = Nothing Then Return CType(JsonConvert.DeserializeObject(empData), JObject).ToString

            If key2 = Nothing Then Return CType(JsonConvert.DeserializeObject(empData), JObject)(key1).ToString()

            Return CType(JsonConvert.DeserializeObject(empData), JObject)(key1)(key2).ToString()


        Catch ex As Exception
            Return ex.Message
        End Try
    End Function

    ''' <summary>
    ''' 序列化 json
    ''' </summary>
    ''' <param name="str">对象</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function JsonEncode(ByVal str As Object) As String
        Try
            Return JsonConvert.SerializeObject(str)
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function


    Public Shared Function JsonSerializeMore_HttpJson(ByVal code As String, ByVal msg As String, Optional ByVal data As Object = Nothing)
        'http://bbs.csdn.net/topics/390910345
        'http://www.cnblogs.com/08shiyan/p/3464028.html
        '  Dim cusList As New List(Of httpjson)()
        'Dim cusList As New List(Of HttpJson)

        'cusList.Add(New HttpJson("6902083881405", "娃哈哈饮用纯净水", ""))
        'cusList.Add(New HttpJson("6902083893736", "娃哈哈营养快线原味"))

        'Dim dic As Dictionary(Of String, HttpJson) = New Dictionary(Of String, HttpJson)
        'dic.Add("1", New HttpJson("1", "2", 1.1))

        ''dic.Add("2222", New HttpJson("1", "2", 1.1))
        '' dic.Add("3333", New HttpJson("1", "2", 1.1))
        'Dim jsonStr As String = Newtonsoft.Json.JsonConvert.SerializeObject(dic)
        'MsgBox(jsonStr)


        'MsgBox(JsonConvert.SerializeObject(cusList))


        Return JsonEncode(New HttpJson(code, data))



    End Function



    ''' <summary>
    ''' json转换datatable
    ''' </summary>
    ''' <param name="strJson"></param>
    ''' <returns>返回 0  非json 数据</returns>
    Public Shared Function JsonToDataTable(ByVal strJson As String) As DataTable

        Dim rg As New Regex("(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase)
        Dim strName As String = rg.Match(strJson).Value
        Dim dt As DataTable = Nothing
        strJson = strJson.Substring((strJson.IndexOf("[") + 1))
        strJson = strJson.Substring(0, strJson.IndexOf("]"))
        Dim matchs As MatchCollection = New Regex("(?<={)[^}]+(?=})").Matches(strJson)
        Dim i As Integer
        For i = 0 To matchs.Count - 1
            Dim strRow As String = matchs(i).Value
            Dim strRows As String() = Split(strRow, ",")

            If (dt Is Nothing) Then
                dt = New DataTable
                dt.TableName = strName
                For Each str As String In strRows
                    Dim dc As New DataColumn
                    Dim strCell As String() = Split(str, ":")
                    dc.ColumnName = strCell(0).Replace("""", "")
                    dc.ColumnName = Trim(dc.ColumnName.Replace(Chr(13), ""))
                    dc.ColumnName = Trim(dc.ColumnName.Replace(Chr(10), ""))
                    dt.Columns.Add(dc)
                Next
                dt.AcceptChanges()
            End If

            Dim dr As DataRow = dt.NewRow()

            For j As Integer = 0 To strRows.Length - 1
                dr(j) = Trim(strRows(j).Split(":")(1).Replace("""", ""))
            Next j
            dt.Rows.Add(dr)
            dt.AcceptChanges()
        Next i
        Return dt
    End Function

    ''' <summary>
    ''' 验证是否 JSON 数据
    ''' </summary>
    ''' <param name="input"></param>
    ''' <returns></returns>
    Public Shared Function IsJson(ByVal input As String) As Boolean

        If input = "" Then Return False '为空字符时会出现异常,这里直接返回,不进行检测
        input = input.Trim
        Return ((input.StartsWith("{") AndAlso input.EndsWith("}")) OrElse (input.StartsWith("[") AndAlso input.EndsWith("]")))
    End Function



End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string jsonstr = "json 待解析的字符";

            MessageBox.Show(

                ((Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstr))["data"]["name"].ToString()

                );

        }


    }
}

转载于:https://my.oschina.net/u/2955242/blog/758484

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值