demo地址git
pod 導入: pod 'PYJsonViewManager'
github
BaseJsonViewController
是一個用OC
編寫的提供了搜索
、插入
、編輯
、查看路徑
、複製json/value
等功能的Json
可視化編輯工具。objective-c
因爲網絡數據請求下來後,
APP
端對json
原數據的展現並不明朗。 修改網絡數據只能經過Charles
等抓包工具實現,受到的限制太多,因此誕生了在APP
端直接對json
進行查看、修改的Json
視圖工具:BaseJsonViewController
。json後續會對
BaseJsonViewController
進行持續的更新優化,歡迎使用。數組
👀all
展開所有,點擊🦆…
壓縮所有(須要注意的是,若是進行了壓縮,處在插入狀態的cell,將被刪除)。Dictionary
Array
String
Number
。點擊放大鏡能夠進入搜索頁面緩存
在源碼中的位置:BaseJsonViewController
->BaseJsonViewMainView
->BaseJsonHeaderView
->BaseJsonViewSearchView
網絡
搜索關鍵詞:輸入關鍵詞,而且會自動進行搜索。iphone
精準搜索:若是選中精準搜索,搜索策略將從
containsString
變成isEqualToString
。工具注意:無論是否爲精準搜索,都區分大小寫。優化
- 搜索Editing:若是選中【搜Editing】按鈕,則會搜索整個
json
中處在Editing
狀態並符合關鍵詞搜索的數據。注意:若是有處在
插入狀態
的數據,這時候會自動被刪除。
上一個\下一個:當搜索完成後,點擊【上一個】、【下一個】自動跳轉到相應的行。
查看總覽:跳轉到一個搜索結果總覽控制器,顯示了搜索結果的路徑及`value
展現路徑/搜索數量:當沒有搜索條件(即:沒有
搜索詞
、且搜Editing
處於非選中狀態)時,顯示的是本控制器節點的路徑。不然顯示的是搜索結果數量。展現路徑/報錯信息:具備滾動、放大功能,最大放大倍數爲1倍
當搜索條件報錯時,展現的是紅色的報錯信息。
當有搜索內容時,展現的是當前選中的搜索結果的節點路徑,
側滑cell,出現刪除功能(注意,由於側滑功能比較多,因此在iphone5
上面會致使刪除功能被遮擋)
複製功能分爲兩種:
cell
對應的節點爲Array
或Dictionary
則會只能複製 json
cell
對應的節點爲String
或Number
則能夠複製json
與value
側滑cell
,並點擊編輯
按鈕開啓編輯功能(下面把被編輯的節點稱爲Model
,把Model
的父節點稱爲SuperModel
)。
SuperModel
類型對Model
的key
的影響:
SuperModel
點爲Array
類型:Model的key
必須爲空。
SuperModel
爲Dictionary
類型:Model的key
必須有值。點擊取消按鈕:取消全部修改。
點擊完成按鈕:
選中
Number
按鈕,轉成Numbser
類型,輸入的值必須爲數字,不然會報錯,並在報錯位置進行顯示。選中
String
按鈕,轉成String
類型,會有個默認值,默認值爲""
。選中
json
按鈕:
- 若是
Model
爲Array
類型,則會把jons
解析出來做爲Model
的子節點數據- 若是
Model
爲Dictionary
類型,則會直接解析Json
,若是json
內包含一個對象則該對象做Model
的數據,把對象的Key
做爲Model
的key
。選中
Dictionary
按鈕:
- 若是
Model
爲Dictionary
類型,則不會產生任何效果,不然Model
清空子節點數據,並把Model
轉成Dictionary
類型。選中
Array
按鈕:若是
Model
爲Array
類型,則不會產生任何效果,不然Model
清空子節點數據,並把Model
轉成Array
類型。
側滑cell
,並點擊插入
按鈕開啓編輯功能
注意:若是在插入
的節點
沒有點擊完成的狀況下,對節點
的父節點
執行收起
操做,會自動刪除剛剛插入的節點
注意:若是插入節點
的父節
點爲Dictionary
類型,插入的節點
在父節點
中的順序
不固定
把被編輯的節點稱爲
Model
。把
Model
的父節點稱爲SuperModel
。把
Model
插入的子節點稱爲SubModel
。把
SuperModel
插入的子節點稱爲SuperSubModel
)。
- 若是
Model
爲Dictionary
則能夠【插入子節點】或【插入父節點】。
- 【插入子節點】:
- 若是
Model
爲關閉
狀態,則自動展開Model
,並在Model
字節點的第一行插入一個新的節點SubModel
,這時候,SubModel
處於被編輯狀態
。- 注意:此時插入的
SubModel
在父節點Model
無序- 【插入父節點】:在
Model
的後面插入爲SuperSubModel
插入SuperSubModel
- 若是
Model
爲Array
類型,則能夠【插入子節點】或【插入父節點】。
- 【插入子節點】:
- 若是
Model
爲展開
狀態,則自動壓縮Model
,並在Model
字節點的第一行插入一個新的節點SubModel
,這時候,SubModel
處於被編輯狀態
。- 注意:此時插入的
SubModel
在父節點Model
有序。- 【插入父節點】:在
Model
的後面插入爲SuperSubModel
插入SuperSubModel
- 若是
Model
爲String
或Number
類型,則能夠【插入父節點】。在Model
的後面插入爲SuperSubModel
插入SuperSubModel
json
的解析
json
解析的時機作了調整:
A
被打開時候,纔會解析A
的子節點數據。A
數據時,優先獲取緩存的A
子節點數據。A
進行編輯
或插入
時,對A
的的子節點數據進行更新。Model
就表明了一個節點,因此Model
的結構相當重要。
level
進行賦值。@property (nonatomic,assign) NSInteger level;
複製代碼
@property (nonatomic,assign) NSInteger count;
複製代碼
@property (nonatomic,assign) BOOL isOpen;
複製代碼
@property (nonatomic,strong) id originData;
複製代碼
@property (nonatomic,strong) NSString *key;
複製代碼
@property (nonatomic,strong) id data;
複製代碼
@property (nonatomic,weak) BaseJsonViewStepModel *superPoint;
複製代碼
typedef enum : NSUInteger {
BaseJsonViewStepModelType_Dictionary,
BaseJsonViewStepModelType_Array,
BaseJsonViewStepModelType_Number,
BaseJsonViewStepModelType_String,
} BaseJsonViewStepModelType;
@property (nonatomic,assign) BaseJsonViewStepModelType type;
複製代碼
typedef enum : NSUInteger {
BaseJsonViewStepCellStatus_Normal,
BaseJsonViewStepCellStatus_EditingSelf,
BaseJsonViewStepCellStatus_InsertItem,
} BaseJsonViewStepCellStatus;
@property (nonatomic,assign) BaseJsonViewStepCellStatus status;
複製代碼
+ (BaseJsonViewStepModel *) createStepModelWithOriginData: (id) data andKey: (NSString *)key
/**
建立 一個model
@param data 原始的子節點數據
@param key 建立出的model對應的key
@return model
*/
+ (BaseJsonViewStepModel *) createStepModelWithOriginData: (id) data andKey: (NSString *)key{
BaseJsonViewStepModel *model = [BaseJsonViewStepModel new];
model.originData = data;
model.key = key;
return model;
}
複製代碼
+ (BaseJsonViewStepModel *(^)(id)) createWithID
類方法,返回一個
block
,block
傳入的是id類型的數據。數據能夠是
BaseJsonViewStepModel
: 直接返回這個data。再也不建立NSString
:先轉成字典,而後建立model
使用方法
BaseJsonViewStepModel.createWithId(data);
+ (BaseJsonViewStepModel *(^)(id)) createWithID {
return ^(id data) {
BaseJsonViewStepModel *model;
if ([data isKindOfClass:BaseJsonViewStepModel.class]) {
model = data;
}
if ([data isKindOfClass:NSString.class]) {
NSDictionary *dic = BaseJsonViewManager.convertToDicWithJson(data);
if (dic) {
model = BaseJsonViewManager.convertToStepModelWithDic(dic);
}
}
if (!model) {
model = [BaseJsonViewStepModel createStepModelWithOriginData:data andKey:@""];
}
return model;
};
}
複製代碼
搜索功能將會搜索出 全部的符合條件的model,並返回一個數組
isSearchEditing
的篩選策略
- isSearchEditing:若是爲true。
- 若是
key
爲nil
,則搜索所有處在編輯狀態的model。- 若是
key
有值
- 若是
isAccurateSearch
爲true:搜索全部key
或value
isEqualToString
key
的正在編輯狀態的model
- 若是
isAccurateSearch
爲true:搜索全部key
或value
containsString
key
的正在編輯狀態的model
/**
搜索
@param key 搜索 關鍵字
@param isAccurateSearch 是否爲精準搜索(若是選中精準搜索,搜索策略將從`containsString` 變成 `isEqualToString`。無論是否爲精準搜索,都區分大小寫)
@param isSearchEditing 是否搜索正在編輯狀態的model
@return 搜索結果
*/
- (NSMutableArray <BaseJsonViewStepModel *>*) searchWithKey:(NSString *)key andIsAccurateSearch: (BOOL) isAccurateSearch andIsSearchEditing:(BOOL) isSearchEditing {
SBaseJsonViewStepSearchModelConfig config;
config.isSearchEditing = isSearchEditing;
config.isAccurateSearch = isAccurateSearch;
config.key = key;
config.model = self;
return BaseJsonViewStepSearchModel.getResultWithSearchConfig(config);
}
複製代碼
從父節點移除本節點
這個功能主要是找到originData中相同的元素,進行刪除。
- (void) removeFromeSuper {
if ([self.superPoint.originData isKindOfClass:NSArray.class]) {
NSArray *array = self.superPoint.originData;
NSMutableArray *arrayM = [[NSMutableArray alloc]initWithArray:array];
[arrayM removeObject:self.originData];
self.superPoint.originData = arrayM;
}
if ([self.superPoint.originData isKindOfClass:NSDictionary.class]) {
NSDictionary *dic = self.superPoint.originData;
NSMutableDictionary *dicM = [[NSMutableDictionary alloc]initWithDictionary:dic];
NSString *key = self.key;
if (key.length > 0) {
dicM[self.key] = nil;
}
self.superPoint.originData = dicM;
}
[self.superPoint reloadDataWitOriginDataProperty];
}
複製代碼
根據原始數據插入節點,並返回BaseJsonViewStepErrorModel
。
BaseJsonViewStepErrorModel
記錄了插入時的錯誤信息
/**
插入一個節點
@param key 節點的key
@param originData 節點的原始子節點y數據
@param index 插入的位置
@return 插入報錯的model
*/
- (BaseJsonViewStepErrorModel *) insertWithKey: (NSString *)key
andOriginData: (id) originData
andIndex:(NSInteger) index;
複製代碼
根據model插入節點,並返回BaseJsonViewStepErrorModel
。
BaseJsonViewStepErrorModel
記錄了插入時的錯誤信息
/**
插入一個Model
@param model 準備插入的 節點 model
@param index 插入的位置
@return 錯誤信息
*/
- (BaseJsonViewStepErrorModel *) insertWithModel: (BaseJsonViewStepModel *) model
andIndex:(NSInteger) index;
複製代碼
截圖:
彩蛋:點擊title
會複製當前Controller展現的json數據呦~
工具剛剛成型,不少須要修改的地方,但願你們敢於提bug 謝謝~
pod 導入: pod 'PYJsonViewManager'