见网站: http://www.json.org/

代码如下:

/*
* Copyright (c) 2013 Calvin Rien
*
* Based on the JSON parser by Patrick van Bergen
* http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
*
* Simplified it so that it doesn't throw exceptions
* and can be used in Unity iPhone with maximum code stripping.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text; namespace MiniJSON
{
// Example usage:
//
// using UnityEngine;
// using System.Collections;
// using System.Collections.Generic;
// using MiniJSON;
//
// public class MiniJSONTest : MonoBehaviour {
// void Start () {
// var jsonString = "{ \"array\": [1.44,2,3], " +
// "\"object\": {\"key1\":\"value1\", \"key2\":256}, " +
// "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " +
// "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " +
// "\"int\": 65536, " +
// "\"float\": 3.1415926, " +
// "\"bool\": true, " +
// "\"null\": null }";
//
// var dict = Json.Deserialize(jsonString) as Dictionary<string,object>;
//
// Debug.Log("deserialized: " + dict.GetType());
// Debug.Log("dict['array'][0]: " + ((List<object>) dict["array"])[0]);
// Debug.Log("dict['string']: " + (string) dict["string"]);
// Debug.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles
// Debug.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs
// Debug.Log("dict['unicode']: " + (string) dict["unicode"]);
//
// var str = Json.Serialize(dict);
//
// Debug.Log("serialized: " + str);
// }
// } /// <summary>
/// This class encodes and decodes JSON strings.
/// Spec. details, see http://www.json.org/
///
/// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
/// All numbers are parsed to doubles.
/// </summary>
public static class Json
{
#region Parser sealed class Parser : IDisposable
{
const string WORD_BREAK = "{}[],:\""; public static bool IsWordBreak(char c)
{
return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -;
} public static object Parse(string jsonString)
{
using (var instance = new Parser(jsonString))
return instance.ParseValue();
} enum TOKEN
{
NONE,
CURLY_OPEN,
CURLY_CLOSE,
SQUARED_OPEN,
SQUARED_CLOSE,
COLON,
COMMA,
STRING,
NUMBER,
TRUE,
FALSE,
NULL
}; StringReader m_json; Parser(string jsonString)
{
m_json = new StringReader(jsonString);
} public void Dispose()
{
m_json.Dispose();
m_json = null;
} object ParseValue()
{
TOKEN nextToken = NextToken;
return ParseByToken(nextToken);
} object ParseByToken(TOKEN token)
{
switch (token)
{
case TOKEN.STRING:
return ParseString();
case TOKEN.NUMBER:
return ParseNumber();
case TOKEN.CURLY_OPEN:
return ParseObject();
case TOKEN.SQUARED_OPEN:
return ParseArray();
case TOKEN.TRUE:
return true;
case TOKEN.FALSE:
return false;
case TOKEN.NULL:
return null;
default:
return null;
}
} Dictionary<string, object> ParseObject()
{
var table = new Dictionary<string, object>(); // ditch opening brace
m_json.Read(); // {
while (true)
{
switch (NextToken)
{
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.CURLY_CLOSE:
return table;
default:
// name
string name = ParseString();
if (name == null)
return null; // :
if (NextToken != TOKEN.COLON)
return null;
// ditch the colon
m_json.Read(); // value
table[name] = ParseValue();
break;
}
}
} List<object> ParseArray()
{
var array = new List<object>(); // ditch opening bracket
m_json.Read(); // [
var parsing = true;
while (parsing)
{
TOKEN nextToken = NextToken; switch (nextToken)
{
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.SQUARED_CLOSE:
parsing = false;
break;
default:
object value = ParseByToken(nextToken); array.Add(value);
break;
}
} return array;
} string ParseString()
{
var sb = new StringBuilder();
char c; // ditch opening quote
m_json.Read(); bool parsing = true;
while (parsing)
{
if (m_json.Peek() == -)
{
parsing = false;
break;
} c = NextChar;
switch (c)
{
case '"':
parsing = false;
break;
case '\\':
if (m_json.Peek() == -)
{
parsing = false;
break;
} c = NextChar;
switch (c)
{
case '"':
case '\\':
case '/':
sb.Append(c);
break;
case 'b':
sb.Append('\b');
break;
case 'f':
sb.Append('\f');
break;
case 'n':
sb.Append('\n');
break;
case 'r':
sb.Append('\r');
break;
case 't':
sb.Append('\t');
break;
case 'u':
var hex = new char[]; for (int i = ; i < ; i++)
{
hex[i] = NextChar;
} sb.Append((char)Convert.ToInt32(new string(hex), ));
break;
}
break;
default:
sb.Append(c);
break;
}
} return sb.ToString();
} object ParseNumber()
{
string number = NextWord; if (number.IndexOf('.') == -)
{
long parsedInt;
Int64.TryParse(number, out parsedInt);
return parsedInt;
} double parsedDouble;
Double.TryParse(number, out parsedDouble);
return parsedDouble;
} void EatWhitespace()
{
while (Char.IsWhiteSpace(PeekChar))
{
m_json.Read(); if (m_json.Peek() == -)
break;
}
} #region Properties char PeekChar
{
get { return Convert.ToChar(m_json.Peek()); }
} char NextChar
{
get { return Convert.ToChar(m_json.Read()); }
} string NextWord
{
get
{
var word = new StringBuilder(); while (!IsWordBreak(PeekChar))
{
word.Append(NextChar); if (m_json.Peek() == -)
break;
} return word.ToString();
}
} TOKEN NextToken
{
get
{
EatWhitespace(); if (m_json.Peek() == -)
return TOKEN.NONE; switch (PeekChar)
{
case '{':
return TOKEN.CURLY_OPEN;
case '}':
m_json.Read();
return TOKEN.CURLY_CLOSE;
case '[':
return TOKEN.SQUARED_OPEN;
case ']':
m_json.Read();
return TOKEN.SQUARED_CLOSE;
case ',':
m_json.Read();
return TOKEN.COMMA;
case '"':
return TOKEN.STRING;
case ':':
return TOKEN.COLON;
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '-':
return TOKEN.NUMBER;
} switch (NextWord)
{
case "false":
return TOKEN.FALSE;
case "true":
return TOKEN.TRUE;
case "null":
return TOKEN.NULL;
} return TOKEN.NONE;
}
} #endregion
} #endregion #region Serializer sealed class Serializer
{
StringBuilder m_builder; Serializer()
{
m_builder = new StringBuilder();
} public static string Serialize(object obj)
{
var instance = new Serializer(); instance.SerializeValue(obj); return instance.m_builder.ToString();
} void SerializeValue(object value)
{
IList asList;
IDictionary asDict;
string asStr; if (value == null)
m_builder.Append("null");
else if ((asStr = value as string) != null)
SerializeString(asStr);
else if (value is bool)
m_builder.Append((bool)value ? "true" : "false");
else if ((asList = value as IList) != null)
SerializeArray(asList);
else if ((asDict = value as IDictionary) != null)
SerializeObject(asDict);
else if (value is char)
SerializeString(new string((char)value, ));
else
SerializeOther(value);
} void SerializeObject(IDictionary obj)
{
bool first = true; m_builder.Append('{'); foreach (object e in obj.Keys)
{
if (!first)
m_builder.Append(','); SerializeString(e.ToString());
m_builder.Append(':'); SerializeValue(obj[e]); first = false;
} m_builder.Append('}');
} void SerializeArray(IList anArray)
{
m_builder.Append('['); bool first = true; foreach (object obj in anArray)
{
if (!first)
m_builder.Append(','); SerializeValue(obj); first = false;
} m_builder.Append(']');
} void SerializeString(string str)
{
m_builder.Append('\"'); char[] charArray = str.ToCharArray();
foreach (var c in charArray)
{
switch (c)
{
case '"':
m_builder.Append("\\\"");
break;
case '\\':
m_builder.Append("\\\\");
break;
case '\b':
m_builder.Append("\\b");
break;
case '\f':
m_builder.Append("\\f");
break;
case '\n':
m_builder.Append("\\n");
break;
case '\r':
m_builder.Append("\\r");
break;
case '\t':
m_builder.Append("\\t");
break;
default:
int codepoint = Convert.ToInt32(c);
if ((codepoint >= ) && (codepoint <= ))
m_builder.Append(c);
else
{
m_builder.Append("\\u");
m_builder.Append(codepoint.ToString("x4"));
}
break;
}
} m_builder.Append('\"');
} void SerializeOther(object value)
{
// NOTE: decimals lose precision during serialization.
// They always have, I'm just letting you know.
// Previously floats and doubles lost precision too.
if (value is float)
{
m_builder.Append(((float)value).ToString("R"));
}
else if (value is int
|| value is uint
|| value is long
|| value is sbyte
|| value is byte
|| value is short
|| value is ushort
|| value is ulong)
{
m_builder.Append(value);
}
else if (value is double
|| value is decimal)
{
m_builder.Append(Convert.ToDouble(value).ToString("R"));
}
else
{
SerializeString(value.ToString());
}
}
} #endregion /// <summary>
/// Parses the string json into a value
/// </summary>
/// <param name="json">A JSON string.</param>
/// <returns>An List&lt;object&gt;, a Dictionary&lt;string, object&gt;, a double, an integer,a string, null, true, or false</returns>
public static object Deserialize(string json)
{
// save the string for debug information
if (json == null)
return null; return Parser.Parse(json);
} /// <summary>
/// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
/// </summary>
/// <param name="json">A Dictionary&lt;string, object&gt; / List&lt;object&gt;</param>
/// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
public static string Serialize(object obj)
{
return Serializer.Serialize(obj);
}
}
}

MiniJson

转载请注明出处:http://www.cnblogs.com/jietian331/p/5779996.html

c#如何序列化与反序列化json文件的更多相关文章

  1. C#序列化及反序列化Json对象通用类JsonHelper

    当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...

  2. Jackson序列化和反序列化Json数据完整示例

    Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会 ...

  3. (推荐JsonConvert )序列化和反序列化Json

    在Json文本和.Net对象之间转换最快的方法是试用JsonSerializer. JsonSerializer通过将.Net对象属性名称映射到Json属性名称,并为其复制值,将.Net对象转换为其J ...

  4. c# 类实例序列化反序列化json文件 (原发布 csdn 2017-10-01 20:02:12)

    前言 前段时间使用了net.json保存对象数据.添加完成后,测试发现300多实例数据保存加载json文件,速度比原方式(BinaryFormatter)慢.但是功能加上后也懒再删掉代码了,索性就采用 ...

  5. day5-python中的序列化与反序列化-json&pickle

    一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...

  6. C# 序列化和反序列化(xml 文件)

    序列化是将对象保存为文本文件或二进制文件: 反序列化则是读取文件信息,还原为对象: 序列化保存为文本内容,主要是 xml 和 json 两种,这里介绍序列化为 xml 文件的方式. 想要序列化,先要在 ...

  7. json数组的序列化和反序列化json数组的序列化和反序列化

    如题,我就不多说了,自己看代码的,很好理解 using System; using System.Collections.Generic; using System.Web; using System ...

  8. Java对象的序列化与反序列化-Json篇

    说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...

  9. C# 序列化与反序列化json

    与合作伙伴讨论问题,说到的c++与c#数据的转换调用,正好就说到了序列化与反序列化,同样也可用于不同语言间的调用,做了基础示例,作以下整理: using System.Data; using Syst ...

随机推荐

  1. CSS3秘笈:第十一章

    表格和表单的格式化 1.表格的各种标签提供了许多有用的“钩子”,可以再上面挂CSS样式.如果创建了<th>标签样式,那么每一个列的标题——<th>标签——看起来就有可能与其他的 ...

  2. Struts2(result 流 )下载

    jsp: <body> <a href="stream.action?fileName=psb.jpg">psb</a> <br> ...

  3. PHP:preg_replace

    关于preg_match: http://www.cnblogs.com/helww/p/3466720.html 关于preg_match_all:暂时没有完整的 preg_replace_call ...

  4. zend笔记

    ZEND_STRL(str)  等价于 (str), (sizeof(str)-1) ZEND_STRS(str)等价于 (str), (sizeof(str))

  5. sqlserver 批量修改表前缀

    先把第一句话放到sqlserver查询器中执行一下.然后把查询结果复制出来,进行编辑...一看你就懂了..简单的sql语句拼装 select ' exec sp_rename "' + na ...

  6. linux下MMC/SD/SDIO驱动系列之二 ---- host注册过程(一)

    参考了 http://blog.csdn.net/xieweihua2012/article/details/12844733 在他的基础上更详细的解析源 ...................... ...

  7. Struts2 知识体系

    1.struts2是什么 struts2是用于企业级Web开发的框架,基于struts2开发Web应用程序,在开发效率.可扩展性.可维护性上都会大有提升. 2.struts2的优点 struts2框架 ...

  8. 3个同一行div的摆放div

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. OpenGL ES 详解纹理生成和纹理映射步骤以及函数

    通常一个纹理映射的步骤是: 创建纹理对象.就是获得一个新的纹理句柄 ID. 指定纹理.就是将数据赋值给 ID 的纹理对象,在这一步,图像数据正式加载到了 ID 的纹理对象中. 设定过滤器.定义了ope ...

  10. easyui formatter 返回easyui组件

    <table id="dg2" title="标题" style="width:400px;float: left;"> < ...