void ZFJsonPrint(ZF_IN const ZFSerializableData &serializableData, ZF_IN_OPT const ZFOutputCallback &outputCallback /* = ZFOutputCallbackDefault */, ZF_IN_OPT const ZFJsonOutputFlags &flags /* = ZFJsonOutputFlagsDefault */) { ZFJsonItem jsonObject = ZFJsonPrintFromSerializableData(serializableData); if(!jsonObject.jsonIsNull()) { ZFJsonToOutput(outputCallback, jsonObject, flags); outputCallback.execute(zfText("\n")); } }
ZFOBJECT_CREATOR_DEFINE(ZFObjectCreatorType_json, data) { ZFJsonItem jsonObject = ZFJsonFromInput(ZFInputCallbackForFileDescriptor(data)); if(jsonObject.jsonIsNull()) { return zfautoObjectNull; } ZFSerializableData serializableData; if(ZFJsonParseToSerializableData(serializableData, jsonObject)) { return ZFObjectFromSerializableData(serializableData); } return zfautoObjectNull; }
ZF_NAMESPACE_GLOBAL_BEGIN /* * <ZFString myAttr="myAttrValue" > * <zfstring category="value" value="123" /> * <zfstring refType="123" refData="123" /> * </ZFString> * * { * "@ZFString" : [ * { * "@zfstring" : [], * "category" : "value", * "value" : "123" * }, * { * "@zfstring" : [], * "refType" : "123", * "refData" : "123" * } * ], * "myAttr" : "myAttrValue" * } */ #define _ZFP_ZFJsonSerializeKey_classPrefix '@' ZFSERIALIZABLEDATA_REFERENCE_TYPE_DEFINE(ZFSerializableDataRefType_json, serializableData, data, outErrorHintToAppend) { ZFJsonItem jsonObject = ZFJsonFromInput(ZFInputCallbackForFileDescriptor(data)); if(jsonObject.jsonIsNull()) { ZFSerializableUtil::errorOccurred(outErrorHintToAppend, zfText("failed to load json object from \"%s\""), data); return zffalse; } return ZFJsonParseToSerializableData(serializableData, jsonObject); }
zfbool ZFJsonParseToSerializableData(ZF_OUT ZFSerializableData &serializableData, ZF_IN const ZFJsonItem &jsonObject, ZF_OUT_OPT zfstring *outErrorHintToAppend /* = zfnull */, ZF_OUT_OPT ZFJsonItem *outErrorPos /* = zfnull */) { if(jsonObject.jsonIsNull()) { ZFSerializableUtil::errorOccurred(outErrorHintToAppend, zfText("null json object")); if(outErrorPos != zfnull) { *outErrorPos = jsonObject; } return zffalse; } ZFJsonItem elementJsonArray; for(zfiterator jsonItemIt = jsonObject.jsonItemIterator(); jsonObject.jsonItemIteratorIsValid(jsonItemIt); jsonObject.jsonItemIteratorNext(jsonItemIt)) { const zfchar *key = jsonObject.jsonItemIteratorGetKey(jsonItemIt); ZFJsonItem jsonItem = jsonObject.jsonItemIteratorGet(jsonItemIt); if(*key == _ZFP_ZFJsonSerializeKey_classPrefix) { serializableData.itemClassSet(key + 1); if(jsonItem.jsonType() != ZFJsonType::e_JsonArray) { ZFSerializableUtil::errorOccurred(outErrorHintToAppend, zfText("json item %s not type of %s"), jsonItem.objectInfo().cString(), ZFJsonType::EnumNameForValue(ZFJsonType::e_JsonArray)); if(outErrorPos != zfnull) { *outErrorPos = jsonItem; } return zffalse; } elementJsonArray = jsonItem; } else { if(jsonItem.jsonType() != ZFJsonType::e_JsonValue) { ZFSerializableUtil::errorOccurred(outErrorHintToAppend, zfText("json item %s not type of %s"), jsonItem.objectInfo().cString(), ZFJsonType::EnumNameForValue(ZFJsonType::e_JsonValue)); if(outErrorPos != zfnull) { *outErrorPos = jsonItem; } return zffalse; } const zfchar *value = jsonItem.jsonValue(); if(zfscmpTheSame(key, ZFSerializableKeyword_refType)) { serializableData.referenceRefTypeSet(value); } else if(zfscmpTheSame(key, ZFSerializableKeyword_refData)) { serializableData.referenceRefDataSet(value); } else { serializableData.attributeSet(zfstring(key).cString(), value); } } } if(serializableData.itemClass() == zfnull) { ZFSerializableUtil::errorOccurred(outErrorHintToAppend, zfText("missing class node (which looks like \"@ClassName\")")); if(outErrorPos != zfnull) { *outErrorPos = jsonObject; } return zffalse; } if(!elementJsonArray.jsonIsNull()) { for(zfindex i = 0; i < elementJsonArray.jsonObjectCount(); ++i) { ZFSerializableData childData; if(!ZFJsonParseToSerializableData(childData, elementJsonArray.jsonObjectAtIndex(i), outErrorHintToAppend, outErrorPos)) { return zffalse; } serializableData.elementAdd(childData); } } return serializableData.referenceCheckLoad(outErrorHintToAppend, zfnull); }