1. 程式人生 > >IT民工——發一個萬能的JSON解析器吧!

IT民工——發一個萬能的JSON解析器吧!


using System;
using System.Collections.Generic;
using System.Text;

namespace Pixysoft.Json
{
    
publicclass CommonJsonModel : CommonJsonModelAnalyzer
    {
        
privatestring rawjson;

        
privatebool isValue =false;

        
privatebool isModel =false;

        
privatebool isCollection =false;

        
internal
 CommonJsonModel(string rawjson)
        {
            
this.rawjson = rawjson;

            
if (string.IsNullOrEmpty(rawjson))
                
thrownew Exception("missing rawjson");

            rawjson 
= rawjson.Trim();

            
if (rawjson.StartsWith("{"))
            {
                isModel 
=true;
            }
            
elseif (rawjson.StartsWith("["))
            {
                isCollection 
=true;
            }
            
else
            {
                isValue 
=true;
            }
        }

        
publicstring Rawjson
        {
            
get { return rawjson; }
        }

        
publicbool IsValue()
        {
            
return isValue;
        }
        
publicbool IsValue(string key)
        {
            
if (!isModel)
                
returnfalse;

            
if (string.IsNullOrEmpty(key))
                
returnfalse;

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                CommonJsonModel model 
=new CommonJsonModel(subjson);

                
if (!model.IsValue())
                    
continue;

                
if (model.Key == key)
                {
                    CommonJsonModel submodel 
=new CommonJsonModel(model.Value);

                    
return submodel.IsValue();
                }
            }

            
returnfalse;
        }
        
publicbool IsModel()
        {
            
return isModel;
        }
        
publicbool IsModel(string key)
        {
            
if (!isModel)
                
returnfalse;

            
if (string.IsNullOrEmpty(key))
                
returnfalse;

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                CommonJsonModel model 
=new CommonJsonModel(subjson);

                
if (!model.IsValue())
                    
continue;

                
if (model.Key == key)
                {
                    CommonJsonModel submodel 
=new CommonJsonModel(model.Value);

                    
return submodel.IsModel();
                }
            }

            
returnfalse;
        }
        
publicbool IsCollection()
        {
            
return isCollection;
        }
        
publicbool IsCollection(string key)
        {
            
if (!isModel)
                
returnfalse;

            
if (string.IsNullOrEmpty(key))
                
returnfalse;

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                CommonJsonModel model 
=new CommonJsonModel(subjson);

                
if (!model.IsValue())
                    
continue;

                
if (model.Key == key)
                {
                    CommonJsonModel submodel 
=new CommonJsonModel(model.Value);

                    
return submodel.IsCollection();
                }
            }

            
returnfalse;
        }


        
///<summary>/// 當模型是物件,返回擁有的key
        
///</summary>///<returns></returns>public List<string> GetKeys()
        {
            
if (!isModel)
                
returnnull;

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

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                
string key =new CommonJsonModel(subjson).Key;

                
if (!string.IsNullOrEmpty(key))
                    list.Add(key);
            }

            
return list;
        }

        
///<summary>/// 當模型是物件,key對應是值,則返回key對應的值
        
///</summary>///<param name="key"></param>///<returns></returns>publicstring GetValue(string key)
        {
            
if (!isModel)
                
returnnull;

            
if (string.IsNullOrEmpty(key))
                
returnnull;

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                CommonJsonModel model 
=new CommonJsonModel(subjson);

                
if (!model.IsValue())
                    
continue;

                
if (model.Key == key)
                    
return model.Value;
            }

            
returnnull;
        }

        
///<summary>/// 模型是物件,key對應是物件,返回key對應的物件
        
///</summary>///<param name="key"></param>///<returns></returns>public CommonJsonModel GetModel(string key)
        {
            
if (!isModel)
                
returnnull;

            
if (string.IsNullOrEmpty(key))
                
returnnull;

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                CommonJsonModel model 
=new CommonJsonModel(subjson);

                
if (!model.IsValue())
                    
continue;

                
if (model.Key == key)
                {
                    CommonJsonModel submodel 
=new CommonJsonModel(model.Value);

                    
if (!submodel.IsModel())
                        
returnnull;
                    
elsereturn submodel;
                }
            }

            
returnnull;
        }

        
///<summary>/// 模型是物件,key對應是集合,返回集合
        
///</summary>///<param name="key"></param>///<returns></returns>public CommonJsonModel GetCollection(string key)
        {
            
if (!isModel)
                
returnnull;

            
if (string.IsNullOrEmpty(key))
                
returnnull;

            
foreach (string subjson inbase._GetCollection(this.rawjson))
            {
                CommonJsonModel model 
=new CommonJsonModel(subjson);

                
if (!model.IsValue())
                    
continue;

                
if (model.Key == key)
                {
                    CommonJsonModel submodel 
=new CommonJsonModel(model.Value);

                    
if (!submodel.IsCollection())
                        
returnnull;
                    
elsereturn submodel;
                }
            }

            
returnnull;
        }

        
///<summary>/// 模型是集合,返回自身
        
///</summary>///<returns></returns>public List<CommonJsonModel> GetCollection()
        {
            List
<CommonJsonModel> list =new List<CommonJsonModel>();

            
if (IsValue())
                
return list;

            
foreach (string subjson inbase._GetCollection(rawjson))
            {
                list.Add(
new CommonJsonModel(subjson));
            }

            
return list;
        }




        
///<summary>/// 當模型是值物件,返回key
        
///</summary>privatestring Key
        {
            
get
            {
                
if (IsValue())
                    
returnbase._GetKey(rawjson);

                
returnnull;
            }
        }
        
///<summary>/// 當模型是值物件,返回value
        
///</summary>privatestring Value
        {
            
get
            {
                
if (!IsValue())
                    
returnnull;

                
returnbase._GetValue(rawjson);
            }
        }
    }
}